Verwenden Sie niemals den Operator "-a" oder "-o" mit "["

11

Stéphane Chazelas schrieb:

ein paar Regeln wie

  • Zitieren Sie immer Variablen
  • Verwenden Sie niemals den Operator -aoder -o(verwenden Sie mehrere [Befehle und die Operatoren &&und ||Shell).

Machen Sie [zuverlässig mit POSIX-Shells.

Warum "niemals den Operator -aoder verwenden -o"?

Wie kann ich "mehrere [Befehle und die &&und ||Shell-Operatoren verwenden"?

Tim
quelle

Antworten:

13

Warum "niemals den Operator -aoder 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 ]; }
kos
quelle
Vielen Dank. (1) "Die Operatoren '(' und ')' wurden als veraltet markiert." Sind (und )die Operatoren, die Befehle gruppieren? Wenn sie veraltet sind, was sind ihre Ersetzungen? (2) Sollte test "$1" -a "$2"ersetzt werden durch test "$1" && test "$2"oder durch ((test "$1" && test "$2"))? Brauchen wir das nicht ((..))?
Tim
@ Tim Siehe das Update. (1) Ja - Sie können ()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 {}.
Kos
Vielen Dank. Ich denke, meine Fragen gehen möglicherweise über diesen Beitrag hinaus. Also poste ich sie in einem neuen Beitrag.
Tim
1
@Tim Der einzige Grund für die Verwendung der Operatoren (und )ist, wenn Sie -aoder verwenden -o. Da letztere veraltet sind, werden erstere offensichtlich auch nicht mehr benötigt.
Barmar