我正在编写一个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,不是吗?
答案 0 :(得分:9)
引用它。
if [ -n "$1" ]; then
如果没有引号,如果$1
为空,则执行[ -n ]
,这是真*,如果$1
不为空,那么显然是真的。
*如果你给[
一个参数(不包括]
),它总是如此。 (顺便说一句,这是许多新用户在期望[ 0 ]
为假时)陷入的陷阱。在这种情况下,单个字符串为-n
。