Sind in Bash [-z "$ 1"] und ["$ 1" = ""] gleich?

28

Was ist der Unterschied (falls vorhanden) zwischen den folgenden beiden Anweisungen in Bash-Shell-Skripten?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

Ich habe festgestellt, dass ich den zweiten Teil in einigen Skripten geschrieben habe, aber dann habe ich hier gelesen , dass die Verwendung von -zdasselbe bewirkt.

Wenn es Probleme mit der zweiten gibt, sollten wir ignorieren, dass die erste etwas besser aussieht?

Johan
quelle
3
Einen detaillierten Vergleich finden Sie in meiner Antwort zum Stapelüberlauf. Siehe auch dies und das .
Bis auf weiteres angehalten.
nette Links, mit einigen netten Antworten :)
Johan

Antworten:

36

[ "$1" = "" ]und [ -z "$1" ]sind in bash und anderen POSIX-kompatiblen Shells genau gleichwertig. (Beachten Sie, dass auf jeder Seite der Klammern ein Leerzeichen stehen muss, es sei denn, es gibt ein Zeichen, das nicht aus einem Wort besteht ;.)

[Ist eine Shell eingebaut wie jede andere; Tatsächlich kann es auch buchstabiert werden test(der einzige Unterschied zwischen den beiden besteht darin, [dass ]als letztes Argument a erforderlich ist ). Also , wenn Sie laufen [ "$1" = "" ]mit $1Erweiterung zu -z, sieht der Prüfer drei Argumente: -z, =und die leere Zeichenkette. Einige ältere Bourne- Shells haben manchmal Analysefehler ausgegeben, wenn ein Operand auf diese Weise wie ein Operator aussah, auch wenn der vollständige Ausdruck keine Mehrdeutigkeit aufwies. Ich weiß nicht, ob irgendeine Version tatsächlich Probleme mit diesem bestimmten Ausdruck hatte, aber komplexere Ausdrücke könnten sie abwerfen. Möglicherweise gab es auch Versionen, die Probleme mit leeren Wörtern hatten. diese hätten auch nicht unterstützt [ -z "$1" ]. Eine gebräuchliche Shell-Sprache ist[ x"$1" = x"" ]. Dadurch wird das Risiko vermieden, dass Operanden als Operatoren analysiert werden, da kein Operator mit einem Buchstaben beginnt.

In ksh, bash und zsh können Sie die doppelte Klammersyntax verwenden [[ -z $1 ]]. Diese neuere Syntax (sie stammt aus den späten 1980er-Jahren und nicht aus der Mitte der 1970er-Jahre) eliminiert das Risiko, dass Operanden als Operatoren analysiert werden, indem statt eines normalen integrierten Konstrukts ein spezielles syntaktisches Konstrukt verwendet wird. Operatoren müssen wörtlich und ohne Anführungszeichen in doppelten Klammern angegeben werden, und Sie müssen Variablenerweiterungen nicht in doppelte Anführungszeichen setzen.

Gilles 'SO - hör auf böse zu sein'
quelle
Der Tippfehler mit dem fehlenden Leerzeichen neben der Klammer wurde behoben.
Johan