Bash 操作员:“!”与“-z”

Bash operators: "!" vs "-z"

运算符“!”有什么区别?并将“-z”应用于字符串?

#Example 1
if [ ! STRING ]; then ...

#Example 2
if [ -z STRING ]; then ...

谢谢

首先你使用单括号。这意味着您正在使用 test 命令而不是 Bash-内置函数。来自手册:

test EXPRESSION or [ EXPRESSION ]: this exits with the status returned by EXPRESSION

! EXPRESSION: test returns true of EXPRESSION is false

-z STRING: test returns true if the length of STRING is zero.

示例:

$ [ -z "foo" ] && echo "zero length" || echo "non-zero length"
non-zero length
$ [ ! -z "foo" ] && echo "non-zero length" || echo "zero length"
non-zero length
$ [ -z "" ] && echo "zero length" || echo "non-zero length"
zero length
$ [ ! -z "" ] && echo "non-zero length" || echo "zero length"
zero length

但现在您想知道 [ ! STRING ]:

手册指出 [ STRING ] 等同于 [ -n STRING ],它测试 STRING 是否具有非零长度。因此 [ ! STRING ] 等同于 [ -z STRING ].

-n STRING: the length of STRING is nonzero.

STRING: equivalent to -n STRING

source: man test


回答:[ ! STRING ]等同于[ -z STRING ]

简答:它们是一样的。


[ ! STRING ]

的否定
[ STRING ] # which is implicitly [ -n STRING ]

所以如果 STRING 的长度 不是非 零,那么 [ ! STRING ] 为真。

[ -z STRING ]
如果 STRING 的长度为零,

也成立。