Ich arbeite mit Bash 3 und versuche, eine Bedingung zu bilden. In C / C ++, ihre Toten einfach: ((A || B) && C)
. In Bash ist das nicht der Fall (ich denke, die Git-Autoren müssen diesen Code beigesteuert haben, bevor sie sich anderen Bestrebungen widmen).
Das funktioniert nicht. Beachten Sie, dass dies <0 or 1>
kein String-Literal ist. es bedeutet eine 0 oder 1 (kommt im Allgemeinen von grep -i
).
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi
Es fuehrt zu:
line 322: syntax error near unexpected token `[['
Ich habe dann versucht:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi
es fuehrt zu:
line 322: syntax error near unexpected token `[['
Ein Teil des Problems besteht darin, dass die Suchergebnisse die trivialen Beispiele und nicht die komplexeren Beispiele mit zusammengesetzten Bedingungen sind.
Wie führe ich eine einfache ((A || B) && C)
in Bash?
Ich bin bereit, es einfach abzuwickeln und die gleichen Befehle in mehreren Blöcken zu wiederholen:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
...
fi
[[ … ]]
wurde in Bash 2.02 hinzugefügt.((…))
wurde in Bash 2.0 hinzugefügt.||
und&&
von[
zu[[
und ändert((
. Gleiche Priorität in[
(verwenden Sie Klammern, um die Reihenfolge der Auswertung zu steuern), aber && hat eine höhere Priorität in[[
und((
als||
(wie in C).Verwendung
[[
:Wenn Sie es vorziehen
[
, funktioniert Folgendes:quelle
Verwenden Sie den
-o
Operator anstelle Ihres verschachtelten ||. Sie können auch-a
&& ersetzen, falls dies in Ihren anderen Anweisungen erforderlich ist.quelle
-a
und gestoßen-o
, aber ich habe nicht mit ihnen experimentiert. Jemand auf Stack Overflow sagte, es zu vermeiden. Ich stimmte ihnen größtenteils zu, da das Skript mit ihnen weniger lesbar ist.[[ ( "$A" -eq "0" || "$B" -ne "0" ) && "$C" -eq "0" ]]
Haben Sie Probleme damit?bash
eine andere Shell halten, die es versteht[[ ... ]]
.