Warum "niemals den Operator -a
oder verwenden -o
"?
Weil sie möglicherweise eindeutig sind und daher nicht POSIX-konform sind :
Die XSI-Erweiterungen, die die binären Primärdaten -a und -o sowie die Operatoren '(' und ')' angeben, wurden als veraltet markiert. (Viele Ausdrücke, die sie verwenden, werden von der Grammatik abhängig von den spezifischen Ausdrücken, die ausgewertet werden, mehrdeutig definiert.) Skripte, die diese Ausdrücke verwenden, sollten in die unten angegebenen Formen konvertiert werden. Obwohl viele Implementierungen diese veralteten Formulare weiterhin unterstützen, sollten Skripte beim Umgang mit vom Benutzer bereitgestellten Eingaben, die mit diesen und anderen primären und Operatoren verwechselt werden könnten, äußerst vorsichtig sein. Wenn der Anwendungsentwickler nicht alle Fälle kennt, die Eingaben in das Skript erzeugen, können Aufrufe wie folgt ausgeführt werden:
test "$1" -a "$2"
sollte geschrieben werden als:
test "$1" && test "$2"
Wie kann ich "mehrere [
Befehle und die &&
und ||
Shell-Operatoren verwenden"?
Durch mehrere Tests und Verketten mit diesen Operatoren; beispielsweise:
[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]
könnte als Äquivalent umgeschrieben werden:
[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])
oder besser:
[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }
(
und)
die Operatoren, die Befehle gruppieren? Wenn sie veraltet sind, was sind ihre Ersetzungen? (2) Solltetest "$1" -a "$2"
ersetzt werden durchtest "$1" && test "$2"
oder durch((test "$1" && test "$2"))
? Brauchen wir das nicht((..))
?()
und{}
als Ersatz verwenden. (2) Der erste;(())
wird für die arithmetische Erweiterung verwendet. Hier möchten Sie den Exit-Status der Testkette testen. Gruppieren Sie die Tests also entweder in einer Subshell()
oder in der aktuellen Shell{}
.(
und)
ist, wenn Sie-a
oder verwenden-o
. Da letztere veraltet sind, werden erstere offensichtlich auch nicht mehr benötigt.