我正在尝试在我们的一个嵌入式设备上为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)未正确运行但我不知道为什么它似乎试图将命令分离出来
答案 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。