对BASH脚本中的-n选项进行测试始终返回true

时间:2013-12-07 03:03:51

标签: bash shell sh

我正在编写一个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. 没有参数:

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

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

1 个答案:

答案 0 :(得分:9)

引用它。

if [ -n "$1" ]; then 

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

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