代码之家  ›  专栏  ›  技术社区  ›  yanachen

bash:[:参数太多错误消息

  •  0
  • yanachen  · 技术社区  · 7 年前

    我正在尝试自动化我们的应用程序备份。该过程的一部分是检查 egrep 在一个 if 声明:

    if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
       [ egrep -i -q "error|warning|fatal|missing|critical" "$File" ]
    then 
      echo "testing"
    fi
    

    我希望它能输出 testing 因为文件存在并且 白鹭 返回success,但我收到一个错误:

    -bash: [: too many arguments
    

    我尝试了各种语法——附加括号、引号等,但错误依然存在。

    请帮助我理解我错在哪里。

    0 回复  |  直到 7 年前
        1
  •  12
  •   tripleee    6 年前

    你经常犯这样的错误 [ 这是问题的一部分 if 语句的语法。事实并非如此;的语法 如果 只是

    if command; then
        : # ... things which should happen if command's result code was 0
    else
        : # ... things which should happen otherwise
    fi
    

    常见的 command 我们用的是 [ 这是命令的别名 test .这是一个比较字符串、数字和文件的简单命令。它接受一个相当狭窄的参数组合,如果您没有将预期的参数传递给它,它往往会生成令人困惑和误导的错误消息。(或者更确切地说,一旦你习惯了错误信息,它就足够了,而且很有用,但如果你不习惯,它们很容易被误解。)

    在这里,您需要检查命令的结果 egrep :

    if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
       egrep -i -q "error|warning|fatal|missing|critical" "$File"
    then
        echo "testing"
    fi
    

    一般来说, 命令 可以是管道或命令列表;然后,最终命令的退出代码是 如果 将检查,类似于脚本中的最后一个命令如何决定脚本的退出状态。

    这些复合命令可以任意复杂,比如

    if read thing
        case $thing in
          '' | 'quit') false;;
          *) true;;
        esac
    then ...
    

    但在实践中,你很少看到一个命令超过一个 如果 声明(虽然这并非闻所未闻;你的复合声明 || 这是一个很好的例子!)

    我只是想说清楚,

    if [ egrep foo bar ]
    

    她在跑步 [ 又称作 测验 关于争论 egrep foo bar 但是 [ With options只接受一个参数,然后检查该参数是否为空字符串。( 白鹭 显然不是空字符串。此处引用是可选的,但可能会更容易看到:

    if [ "egrep" ]; then
        echo "yes, 'egrep' is not equal to ''"
    fi
    

    单独来看,这显然是愚蠢的,但有望成为一个说明性的例子。)

    历史原因 测验 作为一个普通的厨房水槽,作者不想将其作为语法的一部分 如果 是原伯恩壳牌(Bourne shell)不太吸引人的设计之一。痛击 zsh 提供不那么笨重的替代方案(如 [[ bash中的双括号),当然还有POSIX 测验 比贝尔实验室的原创作品要温和得多。

        2
  •  -5
  •   Baptiste    10 年前

    这样做很有效:将你的白鹭放入“$()”,删除-q并进行字符串比较:

    if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
       [ "$(egrep -i 'error|warning|fatal|missing|critical' $File)" != "" ];
    then
    
       echo "testing";
    
    fi
    
    推荐文章