这个shell命令有什么问题

时间:2016-08-31 13:13:16

标签: shell busybox

我正在尝试在我们的一个嵌入式设备上为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

尝试运行时输出:

# 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

我最初没有编写脚本,所以我不知道它什么时候停止工作。似乎用于比较的命令(如果mac地址前缀与给定样本匹配则应返回1,否则返回0)未正确运行但我不知道为什么它似乎试图将命令分离出来

1 个答案:

答案 0 :(得分:7)

问题在于你使用[就好像它是语法一样,而在shell中它是一个需要传递特定参数的命令。

我认为修复应该像删除[和相应的](这是[期望的最后一个参数)一样简单:

if cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03; then

在shell中,if通过查看命令的返回码来工作,无论是[还是其他任何命令。

顺便说一句,我不认为-i的{​​{1}}选项在这种情况下做了一些有用的事情,所以你可以删除它。

请注意,您的情况可以简化(感谢chepner):

grep

匹配行的开头,后跟您已经拥有的部分,后跟冒号或行尾。

可替换地:

if grep -q '^01:02:03(:|$)' /sys/class/net/eth0/address; then

对cut命令的输出进行直接字符串比较,而不是管道连接到grep。