[ -n ]
不使用-n
测试。
在-n
在[ -n ]
是不是在所有的测试。当[
和之间只有一个参数时]
,该参数是一个字符串,将对其进行测试以查看其是否为空。即使该字符串具有前导-
,它仍将被解释为操作数,而不是测试。由于字符串-n
不是空的-它包含两个字符,-
并且n
,不是零characters-- [ -n ]
计算结果为True。
作为伊格纳西奥巴斯克斯-拉姆斯说,那里string
是一个参数,该测试执行上string
在相同的测试通过在其上执行。当碰巧是,没有什么特别的事情发生。的在与所述第二中是简单的字符串被测试空虚。[ string ]
[ -n string ]
string
-n
-n
[ -n ]
-n
[ -n -n ]
当[
和之间只有一个参数时]
,该参数始终是要测试其是否为非空的字符串,即使该名称恰好与测试相同。同样,当和之间有两个参数[
,]
并且第一个参数-n
为时,第二个参数始终是要测试其是否为非空的字符串,即使该名称恰好与测试名称相同。这仅仅是因为的语法[
坚持要求,在[
和之间]
或之后的单个参数-n
是字符串操作数。
由于[ -n ]
不使用-n
测试的原因,因此[ -z ]
不使用-z
测试。
您可以了解更多关于[
在bash
通过检查它的帮助。注意,这是一个内置的shell:
$ 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
是否为空。
[ -t ]
正在测试stdout是否为终端(的缩写[ -t 1 ]
),并且某些shell仍在进行此操作(ksh93
仅在使用纯-t
文本的情况下),因此[ -n "$var" ]
比使用更好[ "$var" ]
。尽管在某些旧的test
实现中对于$var
like 值仍然失败=
,在这种情况下[ "" != "$var" ]
or[ "x$var" != x ]
或case $x in "")...
可能更好。