为什么 -n 带有包含空字符串的未加引号变量返回 true?

为什么 -n 带有包含空字符串的未加引号变量返回 true?

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 都是假的

相关内容