Wenn Sie den folgenden Test in Shell (sh) ausdrücken möchten:
if ( a == 1 && ( b == 1 || b == 2 )) { ... }
Das Beste, was ich bisher schreiben konnte, ist Folgendes:
if [[ $a -eq 1 ]]; then
if [[ $b -eq 1 || $b -eq 2 ]]; then
...
fi
fi
Ich weiß nicht, wie ich && und || zusammensetzen soll mit korrekter Priorität. Googeln hat mir keine Antwort gegeben (Tutorials geben nur grundlegende Beispiele, falls vorhanden)
Was ist die Syntax die beiden zu kombinieren , wenn in einem?
ksh
? Dann würde Ihr anfänglicher Code nur noch ein Paar Klammern erfordern:if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
Antworten:
Beachten Sie, dass dies
[[ ]]
weder in Bourne noch in POSIX der Fall istsh
. Für eine echtesh
Syntax gibt es verschiedene Möglichkeiten.Verwenden Sie nur ein
[ ]
Paaroder Vermeiden von POSIX
-a
und-o
Optionen 11 Ein Grund für die Vermeidung
-a
und-o
maximale Portabilität: Nicht alletest
oder[
Implementierungen können mehr als 4 Argumente verarbeiten. Genau das erhalten Sie, wenn Sie Ausdrücke mit-a
und-o
und verketten\( \)
.quelle
/bin/sh
, ist es falsch, das Skript mit Funktionen zu schreiben, die nicht in enthalten sindsh
. Sie sollten sich bewusst sein, dass diesksh
NICHT istsh
, sondern eine Obermenge vonsh
. Wenn Sie Ihrksh
alssh
Skript deklariertes Skript zu einem System bringen, zu demsh
kein Symlink besteht,ksh
kann es beschädigt werden . Sie können dieses Problem vermeiden, indem Sie sicherstellen, dass Ihr Skript mit der Deklaration übereinstimmt./bin/sh
Willens ruft/bin/sh
. Das Problem ist/bin/sh
nicht zu akzeptieren[[
. Sie können entweder keine[[
Shell verwenden oder verwenden[[
, die z. B.ksh
als Shebang akzeptiert .-a
/-o
werden von einigen Implementierungen nicht unterstützt, aber dass es für beliebige Argumente nicht zuverlässig ist. Like[ "$a" = "$b" -o "$b" = "$c" ]
würde bei vielen Implementierungen für Werte von$a
like fehlschlagen .!
[
Ich habe eine Syntax ausprobiert und das gefunden
funktioniert.
quelle
Ein weiterer POSIX-Ansatz:
quelle
Der richtige Weg, es mit einem bloßen zu tun
shell
:Erläuterung:
test
hier dient als Klammer und-o
als logisches oder. Wenn Sie eine logische und innerhalb der "Klammer" würden Sie verwenden-a
.Mehr dazu finden Sie hier
quelle