我正在编写一个bash脚本,我正在尝试检查是否提供了特定的参数.我注意到[-n arg]测试的一个奇怪的(至少对我来说)行为.对于以下脚本:
#!/bin/bash if [ -n $1 ]; then echo "The 1st argument is of NON ZERO length" fi if [ -z $1 ]; then echo "The 1st argument is of ZERO length" fi
我得到的结果如下:
>没有参数:
xylodev@ubuntu:~$./my-bash-script.sh The 1st argument is of NON ZERO length The 1st argument is of ZERO length
>带参数:
xylodev@ubuntu:~$./my-bash-script.sh foobar The 1st argument is of NON ZERO length
我已经发现用双引号括起$1可以得到预期的结果,但是我仍然想知道为什么当没有使用引号并且没有参数调用脚本时两个测试都返回true?似乎$1为null,所以[-n $1]应该返回false,不是吗?
引用它.
if [ -n "$1" ]; then
如果没有引号,如果$1为空,则执行[-n],这是真*,如果$1不为空,那么显然是真的.
*如果你给[一个参数(不包括)),它总是如此. (顺便说一句,这是许多新用户在期望[0]为假时)陷入的陷阱.在这种情况下,单个字符串是-n.