我有一个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
答案 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 ...]。更多衬衫的测试形式。