2016-08-31 47 views
1

我试图让我们的一个嵌入式设备上的busybox编写的shell脚本可以工作。导致问题的线在下面,我已经包含使用-x标志在shell中运行它的输出。这个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)没有正确运行,但我不知道为什么它似乎试图将命令分离出来。

+2

那'如果'条件永远不会工作。 'cut'本身就是一个命令,它不是'['命令的选项。如果你想使用一个命令流水线作为'if'的条件,就放弃方括号。而在非忙碌的系统上,为了进一步的智慧,“人体测试”。 – ghoti

回答

7

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

我认为修复应该是去掉了[和相应](这是最后一个参数是[预计)一样简单:通过查看返回码

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

在外壳,if作品的命令,无论是[还是任何其他。

顺便说一句,我不认为-i选项grep在这种情况下做任何有用的事情,所以你可以删除它。


请注意,您的条件可以简化(感谢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 

请在剪切命令的输出直接字符串比较,而不是管道到grep。

+0

试过了,像魅力一样工作。谢谢! – RobbG

+1

'cut'命令本身并不是真的必要的:'if grep -q'^ 01:02:03(:| $)'/ sys/class/net/eth0/address;那么'就足够了。 – chepner

+1

或者放弃'grep'以支持简单的文本比较:'if [“$(cut -d:-f 1-3/sys/class/net/eth0/address)”= 01:02:03]; then'。 – chepner