从man bash
:
-n string
True if the length of string is non‐zero.
例子:
# expected
$ var=""; [ -n "$var" ]; echo $?
1
# unexpected?
$ var=""; [ -n $var ]; echo $?
0
在这里我们看到,-n
包含空字符串的不带引号的变量返回 true。为什么?
为什么$var
这里需要引用呢?
答案1
在你的第二种情况($var
未引用)中,由于$var
是空的,它将扩展为空。就像您没有为测试指定任何操作数一样。
在第一种情况下,($var
双引号)$var
仍然会扩展为除了双引号内之外的任何内容,这顺便提供了空字符串""
作为测试的操作数。
更新如下评论中OP的附加问题:
为什么没有操作数的 -n 不会导致“错误:-n 需要操作数”?
我最初对此的回答是,根据手册, 测试
退出时状态为 0(真)或 1(假)
错误包括以下情况“给出了无效的参数”。
一些来自 illkachu 的评论提供了更深入的见解:
一些测试实现(包括 Bash 的)实际上确实会返回一个明显的错误状态,即 0 表示 true,1 表示 false,2 表示错误
然而 :
只是就 shell 条件而言,1 和 2 都是假的