Shell/Bash-Programmierung: Unterschied -o und || in If-Bedingung

furryhamster

Lt. Commander
Registriert
Okt. 2008
Beiträge
1.098
Hi,

ich Entwickle auf einer Bash Shell. Ich habe eine if Bedingung die über eine Funktion prüft ob eine Varibale null ist (returnt 0 oder 1) und zusätzlich prüfe ich (wenn nicht null) ob eine Variable einen von zwei Werten enthält.

Probiert hatte ich es zunächst so:
if checkNull ${MODUS} -o ( [ "${MODUS}" != "modus1" -a "${MODUS}" != "modus2" ] )

Das hat so leider nicht geklappt, da er auch z.B. "Modus3" akzeptiert hat. Durch Zufall bin ich auf folgende funktionierende Lösung gestoßen:

if checkNull ${MODUS} || ( [ "${MODUS}" != "modus1" -a "${MODUS}" != "modus2" ] )

Warum funktioniert das so? Letztlich müsste -o und || doch das gleiche sein oder?
 
Das -o ist Logische Operation das andere eine (||) Bitwise Operation.
 
Ich bin selber kein Bash-Guru, aber es wirkt auf mich, als würdest du schlicht keine Ahnung von den "Eigenheiten" der Bash haben (das ist nicht böse oder negativ gemeint).

Wenn mich nicht alles täuscht, dann klappt dein erster Aufruf nicht, weil du schlicht und ergreifend deiner Funktion "checkNull" den Rest der Zeile als Parameter übergibst, wobei der Teil in runden Klammern in einer Subshell ausgeführt wird. Deine Funktion wird also mit drei Parametern aufgerufen, nämlich "${MODUS}", "-o" und dem Rückgabewert der Subshell, die durch die runden Klammern erzeugt wird.

Das was du mit "-o" erreichen willst, nämlich die Oder-Verknüpfung der Ausdrücke, funktioniert nur in Zusammenhang mit Test (dem Kommando; Wird gerne auch durch eckige Klammern dargestellt), aber nicht mit einem einfachen "If".

Der zweite Ausdruck funktioniert hingegen, weil das "||" ein Bash-Operator ist und in diesem Kontext richtig ausgewertet wird und das macht, was du erreichen willst.

Vielleicht hilft dir das hier weiter: http://wiki.bash-hackers.org/commands/classictest

Alles in Allem solltest du dich generell intensiv mit der Bash beschäftigen, um besser zu verstehen, wie das Teil funktioniert. Es gibt da sehr viele Kleinigkeiten, die man nicht unbedingt erwartet ;)
 
Zuletzt bearbeitet:
Ich bin noch relativ unerfahren/neu in der Shell Programmierung, daher hier auch meine Frage, da ich es verstehen möchte.

Laut diversen Seiten in denen "if" auf der Shell erläutert wird, dürfte -o und || sich nicht unterscheiden.

Daher klingt die Begründung, dass es versucht den kompletten Ausdruck an die Funktion zu geben korrekt sein könnte. Den Link zum Classictest werde ich mir bei Gelegenheit noch einmal genauer anschauen ob solche Probleme demnächst direkt zu verhindern.

Danke für die schnellen Rückmeldungen!
 
Es gibt kein null in der Bash und nicht definierte Variablen können problemlos verwenden werden. Ihr Wert ist leer. Die checkNull-Prüfung kann deshalb entfallen:
Code:
if [ "${MODUS}" != "modus1" -a "${MODUS}" != "modus2" ]

Und gib mal 'man test' an der Konsole ein. -a, -o sind Optionen vom Programm [ was ein Alias für /usr/bin/test ist. Die Bash selbst kann damit nichts anfangen.
 
Zurück
Oben