Pracuję z Bash 3 i próbuję utworzyć warunek. W C / C ++, jego martwy prosta ((A || B) && C)
. W Bash okazało się, że tak nie jest (myślę, że autorzy Git musieli napisać ten kod, zanim przystąpili do innych przedsięwzięć).
To nie działa. Zauważ, że <0 or 1>
nie jest to dosłowny ciąg; oznacza 0 lub 1 (zazwyczaj pochodzi od 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
Powoduje to:
line 322: syntax error near unexpected token `[['
Potem spróbowałem:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi
skutkuje:
line 322: syntax error near unexpected token `[['
Częścią problemu jest to, że wyniki wyszukiwania są trywialnymi przykładami, a nie bardziej złożonymi przykładami ze złożonymi warunkami warunkowymi.
Jak wykonać proste ((A || B) && C)
w Bash?
Jestem gotowy, aby go rozwinąć i powtórzyć te same polecenia w wielu blokach:
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
[[ … ]]
został dodany w bash 2.02.((…))
został dodany w bash 2.0.||
i&&
zmiana z[
na[[
i((
. Równy priorytet w[
(użyj nawiasów, aby kontrolować kolejność oceny), ale && ma wyższy priorytet w[[
i((
niż||
(jak w C).Użyj
[[
:Jeśli wolisz
[
, następujące działania:źródło
Użyj
-o
operatora zamiast zagnieżdżonego ||. Możesz również użyć-a
do zastąpienia &&, jeśli to konieczne w innych wyciągach.źródło
-a
i-o
, ale nie eksperymentowałem z nimi. Ktoś na stosie przepełnienia powiedział, aby tego uniknąć. W większości się z nimi zgadzałem, ponieważ użycie skryptu jest mniej czytelne.[[ ( "$A" -eq "0" || "$B" -ne "0" ) && "$C" -eq "0" ]]
będzie z nimi problem?bash
powłoki lub innej powłoki, która to rozumie[[ ... ]]
.