我正在编写一个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)
我得到的结果如下:
没有参数:
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)带参数:
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,不应该吗?
引用它.
if [ -n "$1" ]; then
Run Code Online (Sandbox Code Playgroud)
没有引号,if $1
是空的,你执行[ -n ]
,这是真*,如果$1
不是空的话,那显然是真的.
*如果你给出[
一个参数(不包括]
),它总是正确的.(顺便说一下,这是许多新用户在他们期望[ 0 ]
错误时陷入的陷阱).在这种情况下,单个字符串是-n
.