Bash if语句不能正常工作

时间:2015-07-09 05:47:35

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

我有一个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

3 个答案:

答案 0 :(得分:7)

回答问题的第一个版本

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

[ $ARG=="clean" ]

使用:

[ "$ARG" = "clean" ]

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

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

第三,最好的做法是使用较低或混合大小写的局部变量。系统使用大写shell变量,您不希望意外覆盖其中一个。

最后,对于[...],字符串意义上的POSIX运算符为=。 Bash会接受===,但=更容易移植。

答案 1 :(得分:0)

第一: 每个字符串都必须用双引号引起来,否则参数将出错。

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

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

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

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

答案 2 :(得分:-1)

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