Unterschied zwischen [[$ variable]] und [[-n $ variable]]?

8

In der bash sind [[ $variable ]]und [[ -n $variable ]]völlig gleichwertig? Nach der folgenden Ausgabe scheint dies der Fall zu sein, aber ich sehe beide Verwendungsformen in Shell-Skripten.

$ 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
iruvar
quelle
Hm. Interessant. Ausgaben von [[ -n $(echo -ne "\0") ]]; echo $?und [ -n $(echo -ne "\0") ]; echo $?unterscheiden sich
dchirikov
@dchirikov, das liegt daran, dass Sie in der zweiten vergessen haben, die Befehlsersetzung zu zitieren, sodass sie letztendlich [ -n ]dieselbe war [ -n -n ]. In anderen Shells als zsh dürfen Befehlsargumente (auch integrierte Argumente) oder Shell-Variablen keine NUL-Zeichen enthalten.
Stéphane Chazelas

Antworten:

4

[ "$var" ]ist gleichbedeutend mit [ -n "$var" ]Bash und den meisten Muscheln heutzutage. In anderen älteren Schalen sind sie gleichwertig sein sollen, aber aus verschiedenen Bugs leiden für einige spezielle Werte von „$ var“ wie =, (oder !.

Ich finde [ -n "$var" ]besser lesbar und ist der Anhänger von [ -z "$var" ].

[[ -n $var ]]ist dasselbe wie [[ $var ]]in allen Shells, in denen diese nicht standardmäßige ksh-Syntax implementiert ist.

test "x$var" != x wäre am zuverlässigsten, wenn Sie auf sehr alte Muscheln tragbar sein möchten.

Stéphane Chazelas
quelle
1

Laut Test für Zeichenfolgen ungleich Null in Bash: [-n “$ var”] oder [“$ var”] sind sie äquivalent.

Sie sind gleichwertig und geben sogar den Namen der Variablen an.

Wichtig zu beachten : Der Name der Frage, die ich zitiere, bezieht sich nur auf [, aber die Antwort berücksichtigt sowohl [als auch [[.

Nozimica
quelle
1
Aber [[]]ist nicht das Äquivalent von []:)
dchirikov
Nein, das sind sie nicht. Aber in der Antwort, die ich zitiere, werden beide Formen berücksichtigt.
Nozimica
Das Verhalten beim Testen von "\ 0" als Variable ist unterschiedlich. Operator [] gibt 0 oder 1. Und [[]] gibt in beiden Fällen 1.
Dchirikov
+1 für den Link, der sehr informativ ist, aber Stephane Chazelas 'Antwort, die ich akzeptiert habe, ist mehr auf den Punkt.
Iruvar