`test -n $ a`和`test -n"$ a"`之间的区别

yan*_*hou 3 bash shell

$ a=""
$ test -n $a
$ echo $?
0
$ test -n a
$ echo $?
0
$ test -n "$a"
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)

他们之间有什么区别?为什么结果不同?

Tom*_*ech 7

如果$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)