Testoperatoren -a und -o Kurzschluss?

8

Do test operators -a und -o short circuit?

Ich habe if [ 0 -eq 1 -a "" -eq 0 ]; then ... ausprobiert, was über die Syntax der zweiten Bedingung geklagt hat. Aber ich kann nicht sagen, ob das ist, weil

  1. -a schließt nicht
  2. oder test möchte alles richtig formatiert haben, bevor es beginnt und es immer noch kurzschließt.

Das Ergebnis führt mich dazu, eine verschachtelte if zu erstellen, wenn ich wirklich eine Situation wollte, in der die erste Bedingung die Ausführung der zweiten Bedingung verhindern würde, wenn eine bestimmte Variable noch nicht gesetzt wäre ...

edit: Warum verwende ich veraltete Operatoren, der Code muss überall in meiner Umgebung funktionieren und ich habe gerade eine Maschine gefunden, auf der

steht

while [ -L "$file" ] && [ "$n" -lt 10 ] && [ "$m" -eq 0 ]; do

ist eine Endlosschleife und das Wechseln zu veraltetem -a führt zu gutem Verhalten:

while [ -L "$file" -a "$n" -lt 10 -a "$m" -eq 0 ]; do

Was soll ich tun? Der erste Ausdruck funktioniert auf vielen Rechnern, aber nicht auf diesem Rechner, der stattdessen den zweiten Ausdruck benötigt ...

    
user1011471 25.09.2015, 21:18
quelle

2 Antworten

5

Pro die POSIX-Spezifikation für den Test :

  

& gt; 4 Argumente:   Die Ergebnisse sind nicht spezifiziert.

Somit gibt POSIX, abgesehen von XSI-Erweiterungen, nichts darüber aus, wie sich das verhält.

Darüber hinaus auch auf einem System mit XSI-Erweiterungen:

  

expression1 -a expression2 : True, wenn sowohl ausdruck1 als auch ausdruck2 wahr sind; sonst falsch. Die -a Binär Primär ist assoziativ gelassen. Es hat eine höhere Priorität als -o. [Ende der Option]

     

expression1 -o expression2 : True, wenn entweder ausdruck1 oder ausdruck2 wahr ist; sonst falsch. Die binäre binäre -o bleibt assoziativ. [Ende der Option]

Es gibt keine Spezifikation in Bezug auf Kurzschlüsse.

Wenn Sie kurzes oder gar kein POSIX-definiertes Verhalten wollen, verwenden Sie && und || , um mehrere, separate Testaufrufe zu verbinden.

Zitieren erneut, von später im Dokument:

  

ANWENDUNGSVERWENDUNG

     

Die XSI-Erweiterungen, die die Binärzeichen -a und -o sowie die Operatoren '(' und ')' angeben, wurden als veraltet markiert. (Viele Ausdrücke, die sie verwenden, werden mehrdeutig von der Grammatik abhängig von den bestimmten auszuwertenden Ausdrücken definiert.) Skripte, die diese Ausdrücke verwenden, sollten in die unten angegebenen Formulare konvertiert werden. Auch wenn viele Implementierungen diese veralteten Formulare weiterhin unterstützen, sollten Skripts beim Umgang mit vom Benutzer bereitgestellten Eingaben, die mit diesen und anderen Primär- und Operatoren verwechselt werden könnten, äußerst vorsichtig sein. Wenn der Anwendungsentwickler nicht alle Fälle kennt, die eine Eingabe in das Skript erzeugen, werden Aufrufe wie folgt angezeigt:

%Vor%      

sollte wie folgt geschrieben werden:

%Vor%
    
Charles Duffy 25.09.2015, 21:26
quelle
1

Nun, Sie kennen das Verhalten bereits, also geht es in dieser Frage wirklich darum, wie man diese Ergebnisse interpretiert. Aber TBH, es gibt nicht viele reale Wortszenarien, in denen Sie ein anderes Verhalten beobachten können.

Ich habe einen kleinen Testfall erstellt, um zu überprüfen, was vor sich geht (zumindest auf meinem System, da die andere Antwort darauf hindeutet, dass es nicht standardisiert ist):

%Vor%

Wenn Sie die Ausgabe überprüfen, sehen Sie, dass bash nach der Datei sucht, also lautet die Antwort:

Die Operatoren schließen nicht kurz.

    
Karoly Horvath 25.09.2015 21:27
quelle

Tags und Links