[[$ variable]]和[[-n $ variable]]之间的区别?


8

用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

嗯 有趣。从输出[[ -n $(echo -ne "\0") ]]; echo $?[ -n $(echo -ne "\0") ]; echo $?不同
dchirikov

@dchirikov,这是因为在第二个代码中,您忘了引用命令替换,因此最终结果是[ -n ]相同[ -n -n ]。在zsh以外的shell中,命令(甚至是内置参数)或shell变量不能包含NUL字符。
斯特凡Chazelas

Answers:


4

[ "$var" ]相当于[ -n "$var" ]现在的bash和大多数shell。在其他旧炮弹,他们的意思是等效的,但不同的错误遭受了“$ VAR”之类的一些特殊值=(!

我觉得[ -n "$var" ]更清晰,是的吊坠[ -z "$var" ]

[[ -n $var ]][[ $var ]]实施非标准ksh语法的所有shell 相同。

test "x$var" != x 如果您想移植到非常旧的外壳,那将是最可靠的。


1

根据Test for bash中非零长度字符串:[-n“ $ var”]或[“ $ var”],是的,它们是等效的。

它们甚至引用变量名也是等效的。

需要注意的重要事项:我引用的问题名称仅指[,但答案同时考虑[[[


1
[[]]不等同于[]:)
dchirikov

不,不是。但是我引用的答案是考虑两种形式。
nozimica

测试“ \ 0”作为变量的行为是不同的。在两种情况下,运算符[]给出0或1。而[[]]给出1。
dchirikov

+1链接非常有用,但是我接受的斯蒂芬·切塞拉斯(Stephane Chazelas)的答案更重要。
iruvar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.