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

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.


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 [[.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.