$ a=""
$ test -n $a
$ echo $?
0
$ test -n a
$ echo $?
0
$ test -n "$a"
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
他们之间有什么区别?为什么结果不同?
如果$a为空,则test -n $a展开为:
'test' '-n'
Run Code Online (Sandbox Code Playgroud)
当test只收到这样的一个参数时,它会进行默认测试,这可能是你混淆的根源.默认测试相同-n,即以下两个是等效的:
test string
test -n string
Run Code Online (Sandbox Code Playgroud)
所以你的测试是字符串-n的长度是否大于零.它确实如此,因此您获得0退出状态.
你的下一个例子:
'test' '-n' 'a'
Run Code Online (Sandbox Code Playgroud)
测试文字字符串的长度是否a大于零.它是,所以你0再次获得退出状态.
最后的测试可能就是你一直想要的.它扩展到:
'test' '-n' ''
Run Code Online (Sandbox Code Playgroud)
现在传递了两个参数,但第二个参数是空的,因此-n测试失败并且您获得1退出状态.
总是引用你的变量!
您可以使用以下命令查看shell如何扩展语句set -x:
$ set -x
$ test -n $a
+ test -n
$ test -n "$a"
+ test -n ''
Run Code Online (Sandbox Code Playgroud)