在 bash 中,[[ $variable ]]
和[[ -n $variable ]]
完全等价吗?从下面的输出来看似乎是这种情况,但我发现这两种形式的使用在 shell 脚本中都很流行。
$ z="abra"
$ [[ $z ]]
$ echo $?
0
$ [[ -n $z ]]
$ echo $?
0
$ z=""
$ [[ $z ]]
$ echo $?
1
$ [[ -n $z ]]
$ echo $?
1
$ unset z
$ [[ $z ]]
$ echo $?
1
$ [[ -n $z ]]
$ echo $?
1
答案1
[ "$var" ]
相当于[ -n "$var" ]
现在的 bash 和大多数 shell。在其他较旧的 shell 中,它们是等效的,但是遭受不同的错误对于“$var”的一些特殊值,例如=
,(
或!
。
我发现[ -n "$var" ]
更清晰的是吊坠[ -z "$var" ]
。
[[ -n $var ]]
[[ $var ]]
与所有实现非标准 ksh 语法的 shell相同。
test "x$var" != x
如果您想移植到非常旧的外壳,这将是最可靠的。
答案2
根据在 bash 中测试非零长度字符串:[ -n “$var” ] 或 [ “$var” ],是的,它们是等价的。
即使引用变量的名称,它们也是等效的。
重要注意事项:我引用的问题名称仅指的是[
,但答案考虑了[
和[[
。