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

Ben*_*ylo 6 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
Run Code Online (Sandbox Code Playgroud)

我得到的结果如下:

  1. 没有参数:

    xylodev@ubuntu:~$ ./my-bash-script.sh
    The 1st argument is of NON ZERO length
    The 1st argument is of ZERO length
    
    Run Code Online (Sandbox Code Playgroud)
  2. 带参数:

    xylodev@ubuntu:~$ ./my-bash-script.sh foobar
    The 1st argument is of NON ZERO length
    
    Run Code Online (Sandbox Code Playgroud)

我已经发现$1用双引号括起来给我的结果符合预期,但我仍然想知道为什么当没有使用引号并且没有参数调用脚本时,两个测试都返回true?它似乎$1是null然后,所以[ -n $1 ]应该返回false,不应该吗?

Kev*_*vin 9

引用它.

if [ -n "$1" ]; then 
Run Code Online (Sandbox Code Playgroud)

没有引号,if $1是空的,你执行[ -n ],这是真*,如果$1不是空的话,那显然是真的.

*如果你给出[一个参数(不包括]),它总是正确的.(顺便说一下,这是许多新用户在他们期望[ 0 ]错误时陷入的陷阱).在这种情况下,单个字符串是-n.