【问题标题】:Bash if statement not working properlyBash if 语句无法正常工作
【发布时间】:2015-09-27 08:02:30
【问题描述】:

我有一个 bash 语句来测试命令行参数。如果传递给脚本的参数是“干净的”,那么脚本会删除所有 .o 文件。否则,它会构建一个程序。但是,无论传递什么(如果有的话),脚本仍然认为参数“clean”正在传递。

#!/bin/bash
if test "`whoami`" != "root" ; then
    echo "You must be logged in as root to build (for loopback mounting)"
    echo "Enter 'su' or 'sudo bash' to switch to root"
    exit
fi
ARG=$1
if [ $ARG == "clean" ] ; then
    echo ">>> cleaning up object files..."
    rm -r src/*.o
    echo ">>> done. "
    echo ">>> Press enter to continue..."
    read
else
    #Builds program
fi

【问题讨论】:

    标签: bash shell if-statement arguments command-line-arguments


    【解决方案1】:

    第一版问题的答案

    在 bash 中,空格很重要。替换:

    [ $ARG=="clean" ]
    

    与:

    [ "$ARG" = "clean" ]
    

    bash 将 $ARG=="clean" 解释为单字符串。如果将单个字符串放在测试语句中,如果字符串为空,则 test 返回 false,如果字符串非空,则返回 true。 $ARG=="clean" 永远不会为空。因此[ $ARG=="clean" ] 将始终返回 true。

    其次,应该引用$ARG。否则,如果它为空,则语句简化为 `[ == "clean" ],这是一个错误(“应为一元运算符”)。

    第三,对局部变量使用小写或混合大小写是最佳做法。系统使用大写的 shell 变量,您不想意外覆盖其中之一。

    最后,对于[...],POSIX 中的相等运算符,在字符串意义上,是=。 Bash 将接受===,但= 更便携。

    【讨论】:

    • 编辑了主帖,但我仍然有同样的问题
    • @Kookerus 嗯。我无法重现那个。添加空格后,脚本对我有用。
    • @Kookerus:你认出单个 '=' 了吗?
    • @Manuel === 几乎是等价的。更改为单个 = 并不能解决问题。
    • @John1024 删除 .sh 扩展名并运行 sudo ./build 给出错误 ./build: line 10: ==: command not found
    【解决方案2】:

    首先: 每个字符串都必须用双引号引起来,否则会出错。

    秒: 对于仅使用=!= 而不是== 以及-n-z 命令的字符串。

    第三: 您可以通过-a-o 命令组合条件,但较新的使用包含在() 您的条件中,以免出错。逻辑运算符通过运算符执行,先计算-o运算符然后-a!例如

    [ -n "$1" -a $1 = '-h' -o $1 = '--help' ] && { usage; exit 0; }
    

    当传递给脚本至少 1 个参数并且是 -h--help 时将起作用。所有空格必须是!!!布什做短周期逻辑评估。因此,当$1 不存在于第二个条件中时,请不要担心,因为该表达式的结果是在第一个条件中确定的。接下来在这种情况下不计算。但是,如果您的参数可能包含空格符号,则需要双引号。您也必须在命令行中执行此操作!否则您会在脚本中出错或将您的论点分成两部分或更多部分。

    【讨论】:

      【解决方案3】:

      运算符 == 未在测试中使用。对于数字(不是siring),使用 -eq 或 -ne 命令。有关完整描述,请参见 man 1 test。测试 EXPRESSION... 相当于 [ EXPRESSIONS... ]。更多衬衫形式的测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-23
        • 2016-04-14
        • 1970-01-01
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        相关资源
        最近更新 更多