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 -z
dasselbe bewirkt.
Wenn es Probleme mit der zweiten gibt, sollten wir ignorieren, dass die erste etwas besser aussieht?
bash
shell-script
Johan
quelle
quelle
Antworten:
[ "$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 werdentest
(der einzige Unterschied zwischen den beiden besteht darin,[
dass]
als letztes Argument a erforderlich ist ). Also , wenn Sie laufen[ "$1" = "" ]
mit$1
Erweiterung 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.quelle