【问题标题】:Command inside if statement of bash script [duplicate]bash脚本的if语句中的命令[重复]
【发布时间】:2011-03-11 17:40:15
【问题描述】:

我将以下行作为更大的 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 行是上面的行。有什么修复建议吗?

【问题讨论】:

    标签: bash if-statement conditional syntax-error


    【解决方案1】:

    您无需任何额外的语法即可运行您的命令。例如,下面检查 grep 的退出代码来判断正则表达式是否匹配:

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

    【讨论】:

    • 这就是我要找的...
    • 有什么理由不使用这种技术,因为它很少被提及?
    • 可能我自己找到了原因:使用 grep 效果很好,但使用其他命令可能会输出 sth。 (而不仅仅是返回一个代码),这个输出将被打印到标准输出。 if command >& /dev/null; then ... 是怎么回事?
    • 如果命令输出的东西确实更好使用if ! cmp foo.txt bar.txt > /dev/null 2> /dev/null ;then ...
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      发生错误是因为您的命令替换没有返回任何有效地使您的测试看起来像:

      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】:

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2012-11-19
            • 1970-01-01
            • 2017-08-15
            • 1970-01-01
            • 1970-01-01
            • 2023-01-13
            • 2014-05-26
            • 2019-08-15
            • 1970-01-01
            相关资源
            最近更新 更多