这个 shell 命令有什么问题

What's wrong with this shell command

我正在尝试让为我们的嵌入式设备上的 busybox 编写的 shell 脚本运行。导致问题的行在下面,我将 运行ning 的输出包含在带有 -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 地址前缀与给定样本匹配,则应该 return 1,否则为 0)未正确 运行 但我没有知道为什么它似乎试图将命令分开。

问题是您将 [ 当作语法来使用,而在 shell 中,它是一个需要传递特定参数的命令。

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

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

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

顺便说一句,我认为 grep-i 选项在这种情况下没有任何用处,因此您可以删除它。


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

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

匹配行的开头,然后是您已有的部分,然后是冒号或行尾。

或者:

if [ "$(cut -d : -f 1-3 /sys/class/net/eth0/address)" = 01:02:03 ]; then

对 cut 命令的输出进行直接字符串比较,而不是通过管道传递给 grep。