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

Testing against -n option in BASH scripts always returns true

我正在编写一个bash脚本,其中我正在尝试检查是否提供了特定的参数。我注意到[ -n arg ]测试有一种奇怪的(至少对我来说)行为。对于以下脚本:

1
2
3
4
5
6
7
8
9
#!/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
    2
    3
    xylodev@ubuntu:~$ ./my-bash-script.sh
    The 1st argument is of NON ZERO length
    The 1st argument is of ZERO length
  • 带参数:

    1
    2
    xylodev@ubuntu:~$ ./my-bash-script.sh foobar
    The 1st argument is of NON ZERO length
  • 我已经发现,用双引号括起来的EDOCX1[1]会给我预期的结果,但是我仍然想知道,为什么两个测试在不使用引号和不使用参数调用脚本时都返回true?那么,似乎$1是空的,所以[ -n $1 ]应该返回false,不是吗?


    引用它。

    1
    if [ -n"$1" ]; then

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

    *如果你给[一个单独的论点(不包括]),它总是正确的。(顺便说一句,当许多新用户预期[ 0 ]是错误的时,这是一个陷阱)。在这种情况下,单个字符串是-n