if [ [[ $HOST == user1 ]] -o [[ $HOST == node* ]] ];
then
echo yes
fi
funktioniert nicht, weil alle [
, [[
そして test
die gleiche nicht-rekursive Grammatik erkennen. Siehe Abschnitt BEDINGTE AUSDRÜCKE auf Ihrer Bash-Manpage.
Nebenbei bemerkt, sagt die SUSv3
Der von der KornShell abgeleitete bedingte Befehl (doppelte Klammer [[]] ) wurde in einem frühen Vorschlag aus der Beschreibung der Shell-Befehlssprache entfernt. Es wurde eingewandt, dass das eigentliche Problem der Missbrauch der Test Befehl ( [ ), und es in die Shell einzubauen ist der falsche Weg, das Problem zu lösen. Stattdessen sollten eine ordentliche Dokumentation und ein neues für die Shell reserviertes Wort ( ! ) sind ausreichend.
Tests, die eine Vielzahl von Test Operationen können auf der Shell-Ebene mit einzelnen Aufrufen des Befehls Test Befehl und Shell-Logicals zu verwenden, anstatt die fehleranfällige -o Flagge von Test .
Sie müssten es so schreiben, aber Test unterstützt es nicht:
if [ $HOST == user1 -o $HOST == node* ];
then
echo yes
fi
Test verwendet \= für die Gleichheit von Zeichenketten, und, was noch wichtiger ist, es unterstützt keinen Mustervergleich.
case
/ esac
bietet eine gute Unterstützung für den Mustervergleich:
case $HOST in
user1|node*) echo yes ;;
esac
Es hat den zusätzlichen Vorteil, dass es nicht von der Bash abhängt und die Syntax portabel ist. Von der _Einzelne Unix-Spezifikation_ , Die Shell-Befehlssprache :
case word in
[(]pattern1) compound-list;;
[[(]pattern[ | pattern] ... ) compound-list;;] ...
[[(]pattern[ | pattern] ... ) compound-list]
esac