2011-03-11 36 views
12

我有以下线作为一个更大的bash脚本的一部分:命令里面如果bash脚本的声明

if [ `packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^ *//g'` -eq 1 ] 

一旦运行该脚本,我得到:

运行./install.sh :第219行:[:-eq:一元运算符预期

其中第219行是上面的行。任何修复建议?

回答

22

当您通过[使用test内建函数并且左侧表达式返回NUL时,会发生这种情况。

if [ x`some | expression | here` = x1 ]; then 

或者,你已经在使用bash,因为你可以使用它好得多(())语法,不存在这个问题,并做::您可以通过使用修复此

if (($(some | expression | here) == 1)); then 

请注意,我还用$()的命令替换了反引号``因为后者是非POSIX和弃用

4

尝试[[test_expression]];而不是[test_expression];发生

8

的错误,因为你的命令替换有效地返回任何使你的测试看起来像:

if [ -eq 1 ] 

一种常见的方式来解决,这是对等式的两边一些恒定的追加,所以没有操作变得空在任何时候:

if [ x`packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^ *//g'` = x1 ] 

注意=被用作我们现在比较字符串。

4

您可以添加一个“x”的两侧对比,或者你可以只引用左侧:

[ "$(command | pipeline)" = 1 ] 

我不明白最后cutsed是什么。流水线中的wc -l的输出只是一个数字。

18

你可以运行你的命令而不需要任何额外的语法。例如,下列检查的grep的退出代码来确定正则表达式是否匹配:

if ! grep -q "$word" /usr/share/dict/words 
then 
    echo "Word $word is not valid word!" 
fi 
+1

这就是我一直在寻找... – mmey 2014-11-15 12:59:21

+0

有什么理由不使用这种技术,因为它是提到很少? – 2016-02-23 09:05:34

+1

也许我自己找到了原因:用grep很好用,但用其他命令,可能会输出某些东西。 (而不只是返回一个代码),这个输出将被打印到标准输出。什么是'''if if>&/ dev/null;那么...''''? – 2016-02-23 13:37:40