我需要通过编号获取接口。我的脚本:
#!/bin/bash
interfaces=/root/tt
interfaces_with_numbers=/root/tt2
ls -1 /sys/class/net > /root/tt
cat -n $interfaces > $interfaces_with_numbers
cat $interfaces_with_numbers
read number
echo $number
eth=`cat $interfaces_with_numbers | grep $number | awk '{ print $2 }'`
if [[ -d /sys/class/net/$eth ]];then
echo "You choose is: $eth"
else
echo "not found"
fi
我有输出:
1 dummy0
2 eno1
3 enp4s0
4 lo
5 virbr0
6 virbr0-nic
它只是带有空格的文本文件。好的。脚本询问我要输入什么。我输入了“2”。它正在运行 - 结果,我得到了接口的名称。我输入了“1”,但结果“未找到”。我在 Linux 命令行中写道:
cat tt2 | grep 1 | awk '{ print $2 }'
我得到的输出是:
dummy0
eno1
如何正确执行此脚本?请帮忙。感谢您的关注。
答案1
根据您选择的界面,grep 可能会找到多个答案。例如,选择菜单项 #1 将导致 grep 找到1 dummy0
和2 eno1
。这会导致 grep 返回两个结果,它们之间用换行符分隔。例如:
eth='dummmy0 eno1'
当-d
尝试评估时eth
,它会尝试评估整个变量,包括回车符,并且该语句显然返回 false。尝试使用 egrep 和正则表达式进行修复。^\s+$number
只会在行首查找匹配项。将\s+
考虑数字前缀的制表符或其他空格:
eth=`cat $interfaces_with_numbers | egrep "^\s+$number" | awk '{ print $2 }'
答案2
您可以使用awk
来准确检查匹配条件:
eth=`awk "(\$1==$number) { print \$2 }" $interfaces_with_numbers`