我有一个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中,空格很重要。 替换为
[ $ARG=="clean" ]
用:
[ "$ARG" = "clean" ]
bash的解释是 $ARG=="clean"
作为一个单字符串。 如果在测试语句中放置一个单字符串,如果字符串为空,则test返回false,如果非空则返回true。 $ARG=="clean"
则永远不会为空。 因此 [ $ARG=="clean" ]
将永远返回真。
第二: $ARG
应该被引用。 否则,如果它是空的,那么语句就会简化为`[ == "clean"],这是一个错误("预期的单利运算符")。
第三,最好的做法是对你的局部变量使用小写或混合大小写。 系统使用大写的shell变量,你不希望意外地覆盖其中一个变量。
最后,在使用 [...]
在字符串意义上,等价的POSIX运算符是 =
. Bash可以接受以下两种方式 =
或 ==
不过 =
是比较便携的。