Einige historische Shells implementierten einen sehr einfachen Parser, der verwirrt werden könnte, [ -n = "" ]
wenn der erste Operand =
wie ein Operator aussieht und dies als [ -n = ]
Syntaxfehler interpretiert oder verursacht. In [ "x$1" = x"" ]
stellt das x
Präfix sicher, dass x"$1"
es möglicherweise nicht wie ein Operator aussehen kann. Die Shell kann diesen Test also nur analysieren, indem sie ihn =
als binären Operator behandelt.
Alle modernen Shells und sogar die meisten älteren Shells, die noch in Betrieb sind, folgen den POSIX-Regeln, die vorschreiben, dass alle Testausdrücke mit bis zu 4 Wörtern korrekt analysiert werden. Dies [ -z "$1" ]
ist eine geeignete Methode zum Testen, ob $1
leer ist , und [ "$x" = "$y" ]
eine geeignete Methode zum Testen der Gleichheit zweier Variablen.
Sogar einige aktuelle Shells können mit längeren Ausdrücken verwechselt werden, und einige Ausdrücke sind tatsächlich mehrdeutig. Vermeiden Sie daher die Verwendung der Operatoren -a
und -o
, um längere boolesche Tests zu erstellen, und verwenden Sie stattdessen separate Aufrufe [
der eigenen &&
und ||
booleschen Operatoren der Shell .
Gilles 'SO - hör auf böse zu sein'
quelle
sh
s auf einigen kommerziellen Unices haben immer noch das Problem. Einzelheiten finden Sie hier .[ -z "$1" ]
ist eine geeignete Methode zum Testen, ob$1
leer ist .sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
- beide geben 0 zurück, aber im zweiten Fall$1
kann es nicht leer sein, da es nicht existiert.Laut http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html ist der
-z
Test in einigen Implementierungen unsicher , vermutlich wenn "interessante" Strings wie"-o a=a"
getestet werden.quelle
Die obigen Tests verursachen auch einen Fehler, wenn Sie mit "set -u" oder "set -o nounset" ausführen.
Eine stabilere Möglichkeit, nach einer leeren Variablen zu suchen, ist die Verwendung der Parametererweiterung :
MYVAR = $ {MYVAR: - "Schlechter Wert"}
Diese Methode funktioniert für die traditionelle Bourne-Shell sowie für ksh und bash.
quelle
quelle
=
Vergleich zu-z
jetzt , wie.