我正在尝试在我们的一个嵌入式设备上为busybox编写一个shell脚本来工作.导致问题的行在下面,我已经将它的输出包含在带有-x标志的shell中.
if [ cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03 ]; then
# Do stuff
fi
Run Code Online (Sandbox Code Playgroud)
尝试运行时给出的输出:
# sh -x ./script
+ [ cut -d : -f 1-3 /sys/class/net/eth0/address
sh: missing ]
+ grep -q -i 01:02:03 ]
grep: ]: No such file or directory
+ sync
Run Code Online (Sandbox Code Playgroud)
我最初没有编写脚本,所以我不知道它什么时候停止工作.似乎用于比较的命令(如果mac地址前缀与给定样本匹配则应返回1,否则返回0)未正确运行但我不知道为什么它似乎试图将命令分离出来.
问题是你正在使用[它就好像它是语法,而在shell中它是一个命令,需要传递给它的特定参数.
我认为修复应该像删除[和对应的那样简单](这是[期望的最后一个参数):
if cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03; then
Run Code Online (Sandbox Code Playgroud)
在shell中,if通过查看命令的返回代码来工作,无论是否是[其他命令.
顺便说一句,我不认为在这种情况下做任何有用的-i选项grep,所以你可以删除它.
请注意,您的情况可以简化(感谢chepner):
if grep -q '^01:02:03(:|$)' /sys/class/net/eth0/address; then
Run Code Online (Sandbox Code Playgroud)
匹配行的开头,然后是您已经拥有的部分,后跟冒号或行尾.
或者:
if [ "$(cut -d : -f 1-3 /sys/class/net/eth0/address)" = 01:02:03 ]; then
Run Code Online (Sandbox Code Playgroud)
在cut命令的输出上进行直接字符串比较,而不是管道到grep.