Bash if语句不能正常工作

问题描述 投票:2回答:1

我有一个bash语句来测试一个命令行参数。如果传递给脚本的参数是 "clean",那么脚本就会删除所有.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个回答
7
投票

问题第一版的回答

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

[ $ARG=="clean" ]

用:

[ "$ARG" = "clean" ]

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

第二: $ARG 应该被引用。 否则,如果它是空的,那么语句就会简化为`[ == "clean"],这是一个错误("预期的单利运算符")。

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

最后,在使用 [...]在字符串意义上,等价的POSIX运算符是 =. Bash可以接受以下两种方式 === 不过 = 是比较便携的。

© www.soinside.com 2019 - 2024. All rights reserved.