Klassische Technik (Escape Metazeichen):
if [ \("$g" -eq 1 -a "$c" = "123" \) -o \("$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi
ich die Verweise auf $g
in doppelte Anführungszeichen eingeschlossen haben; Das ist im Allgemeinen eine gute Übung. Streng genommen werden die Klammern nicht benötigt, weil die Priorität -a
und -o
sie auch ohne sie korrekt macht.
Beachten Sie, dass die -a
und -o
Betreiber Teil der POSIX-Spezifikation für test
sind, auch bekannt als [
, vor allem für die Abwärtskompatibilität (da sie zum Beispiel ein Teil der test
in 7. Auflage UNIX waren), aber sie sind explizit gekennzeichnet als "veraltet" von POSIX. Bash (siehe conditional expressions) scheint die klassischen und POSIX-Bedeutungen für -a
und -o
mit seinen eigenen alternativen Operatoren, die Argumente entgegennehmen, vorwegzunehmen.
Mit etwas Sorgfalt, können Sie den modernere [[
Operator verwenden, aber darüber im Klaren sein, dass die Versionen in Bash und Korn Shell (zum Beispiel) nicht identisch sein müssen.
for g in 1 2 3
do
for c in 123 456 789
do
if [[ ("$g" -eq 1 && "$c" = "123") || ("$g" -eq 2 && "$c" = "456") ]]
then echo "g = $g; c = $c; true"
else echo "g = $g; c = $c; false"
fi
done
done
Beispiel läuft, mit Bash 3.2.57 auf Mac OS X:
g = 1; c = 123; true
g = 1; c = 456; false
g = 1; c = 789; false
g = 2; c = 123; false
g = 2; c = 456; true
g = 2; c = 789; false
g = 3; c = 123; false
g = 3; c = 456; false
g = 3; c = 789; false
Sie brauchen nicht die Variablen in [[
zu zitieren, wie Sie mit [
tun, weil es keinen separaten Befehl in der gleichen Weise, wie [
ist.
Ist es nicht eine klassische Frage?
Ich hätte das gedacht. Allerdings gibt es eine weitere Alternative ist, nämlich:
if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi
der Tat, wenn Sie die ‚portable Shell‘ Richtlinien für die autoconf
Werkzeug oder verwandte Pakete lesen, diese Notation - ‚||
‘ und ‚&&
‘ mit - ist das, was sie empfehlen. Ich nehme an, Sie sogar so weit gehen könnte:
if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi
Wo die Aktionen so trivial, wie Echo sind, ist dies nicht schlecht. Wenn der zu wiederholende Aktionsblock mehrere Zeilen umfasst, ist die Wiederholung zu schmerzhaft und eine der früheren Versionen ist vorzuziehen - oder Sie müssen die Aktionen in eine Funktion umbrechen, die in den verschiedenen then
Blöcken aufgerufen wird.
Sie fragt nicht über Shell-Bedingungen, aber [Test] (https://de.wikipedia.org/wiki/Test_%28Unix % 29) Bedingungen. Der gesamte Ausdruck in Ihrem Beispiel wird durch 'test' (' ['') und nicht durch die Shell ausgewertet. Die Shell wertet nur den Exit-Status von '[' aus. – ceving
Siehe auch http://stackoverflow.com/questions/16203088/multiple-conditions-if-statement-bash-script – tripleee