脚本在 Bash 中无法正常工作

脚本在 Bash 中无法正常工作

我需要通过编号获取接口。我的脚本:

#!/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 dummy02 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`

相关内容