我的问题是关于此代码生成的返回值:
if [ -n ]; then echo "true"; else echo "false"; fi
这打印true
.
其补充测试[ -z ]
还使用打印true
:
if [ -z ]; then echo "true"; else echo "false"; fi
在上面的代码中,为什么[ -n ]
测试假设根本没有传递的字符串值不为空?
下面的代码打印false
.这是预期的,因为传递的字符串值为空且长度为零。
if [ -n "" ]; then echo "true"; else echo "false"; fi
答案1
[ -n ]
不使用-n
测试。
-n
in根本[ -n ]
不是一个测试。当[
和之间只有一个参数时]
,该参数是一个字符串,将测试它是否为空。即使该字符串具有前导-
,它仍然被解释为操作数,而不是测试。由于字符串-n
不为空——它包含两个字符,-
并且n
,不是零个字符——[ -n ]
计算结果为真。
作为伊格纳西奥·巴斯克斯·艾布拉姆斯 说, 在哪里string
是一个参数,测试执行于string
in与 对其执行的测试相同。什么时候[ string ]
[ -n string ]
string
碰巧是-n
,没有什么特别的事情发生。 in和第二个in只是测试是否为空的字符串-n
。[ -n ]
-n
[ -n -n ]
[
当和之间只有一个参数时]
,该参数始终是要测试非空性的字符串,即使它碰巧与测试命名相同。类似地,当 和 之间有两个参数并且其中第一个参数[
是]
时-n
,第二个参数始终是要测试非空性的字符串,即使它碰巧与测试命名相同。这只是因为 for 的语法坚持认为 和 之间或之后的[
单个参数是字符串操作数。[
]
-n
出于同样的原因,[ -n ]
不使用-n
测试,[ -z ]
不使用-z
测试。
您可以通过查看它的帮助来了解有关[
in 的更多信息。bash
请注意,这是一个外壳内置:
$ type [
[ is a shell builtin
因此,您可以运行help [
以获得有关它的帮助:
$ help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
有关更多信息,包括支持哪些测试以及它们如何工作,您必须查看 上的帮助test
。当您运行该命令时help test
,您将获得详细列表。下面是关于字符串运算符的部分,而不是全部重现:
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically.
请注意,-n STRING
只需STRING
执行相同的操作:它们测试字符串是否STRING
不为空。
答案2
[
X]
相当于[ -n
X]
即使X-
如果没有操作数,则从 开始。
$ [ -o ] ; echo $?
0
$ [ -eq ] ; echo $?
0
$ [ -n -o ] ; echo $?
0
$ [ -n -eq ] ; echo $?
0
答案3
[ -n ]
为真,因为[
命令(又名test
命令)作用于数字给出的论点。如果仅给出一个参数,且参数为非空字符串,则结果为“true”。 “-n”是一个包含 2 个字符的字符串,非空,因此“true”。