命令里面的if语句的bash脚本

时间:2011-03-11 17:40:15

标签: bash if-statement conditional syntax-error

我将以下行作为更大的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:line 219:[: - eq:一元运算符预期

第219行是上面的行。有任何修复建议吗?

5 个答案:

答案 0 :(得分:28)

当您通过test使用[内置并且左侧表达式返回NUL时会发生这种情况。您可以使用以下方法解决此问题:

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

或者,既然你已经在使用bash,你可以使用它没有这个问题的更好的(( ))语法并执行:

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

请注意,我还使用$()来替换反引号命令,因为后者是非POSIX并且已弃用

答案 1 :(得分:23)

您可以在不使用任何其他语法的情况下运行命令。例如,以下检查grep的退出代码以确定正则表达式是否匹配:

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

答案 2 :(得分: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 ] 

请注意,正在使用=,因为我们现在正在比较字符串。

答案 3 :(得分:6)

您可以在比较的两边添加“x”,或者您可以引用左侧:

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

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

答案 4 :(得分:4)

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