在BASH脚本中对-n选项进行测试总是返回true

6
我正在编写一个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

我得到的结果如下:
  1. with no parameters:

    xylodev@ubuntu:~$ ./my-bash-script.sh
    The 1st argument is of NON ZERO length
    The 1st argument is of ZERO length
    
  2. with parameters:

    xylodev@ubuntu:~$ ./my-bash-script.sh foobar
    The 1st argument is of NON ZERO length
    
我已经发现将$1用双引号括起来可以得到预期的结果,但我仍然想知道为什么在不使用引号且没有参数调用脚本时两个测试都返回true?看起来此时$1是null,所以[ -n $1 ]应该返回false,不是吗?

1个回答

10

引用它。

if [ -n "$1" ]; then 

不带引号,如果$1为空,则执行[ -n ],它为真*,如果$1不为空,则显然为真。

*如果你给[一个单独的参数(不包括]),它总是为真。 (顺便说一句,这是许多新用户陷入的陷阱,因为他们期望[ 0 ]为假)。在这种情况下,单个字符串是-n


我不知道在上述情况下,当没有为“[`命令提供其他参数时,“-n”被视为字符串。现在清楚了。感谢您的解释。 - Benoît Xylo
那么,下面这个例子怎么样?它似乎在说 '1' 是 null:$> b=1; if [ -n "$b" ]; then echo "true"; else echo "false"; fi true - Tom Russell
不是空值,而是非零长度,-n用于测试。 - PJSCopeland
1
此表格中,[ STRING ]实际上被视为等同于[ -n STRING ] - PJSCopeland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接