Operator && wykonuje następne polecenie, jeśli poprzednie polecenie zakończyło się pomyślnie (zwrócony kod wyjścia ($?) 0 = logiczna prawda).
W formie A && B || C
polecenie (lub warunek) A jest oceniane, a jeśli A zwróci wartość true (sukces, kod wyjścia 0), wówczas polecenie B zostanie wykonane. Jeśli A nie powiedzie się (w ten sposób zwróci fałsz - kod wyjścia inny niż 0) i / lub B zawiedzie ( zwróci fałsz ), wówczas polecenie C zostanie wykonane.
Również &&
operator jest używany jako AND w sprawdzaniu stanu, a operator ||
działa jak OR w sprawdzaniu stanu.
W zależności od tego, co chcesz zrobić ze skryptem, formularza A && B || C
można użyć do sprawdzania warunków, takiego jak twój przykład, lub do połączenia poleceń i zapewnienia serii poleceń do wykonania, jeśli poprzednie polecenia miały kod wyjścia 0 .
To dlatego jest często można zauważyć komendy jak:
do_something && do_something_else_that_depended_on_something
.
Przykłady:
apt-get update && apt-get upgrade
Jeśli aktualizacja się nie powiedzie, aktualizacja nie zostanie wykonana (ma to sens w prawdziwym świecie ...).
mkdir test && echo "Something" > test/file
Część echo "Something"
zostanie wykonana tylko wtedy, gdy mkdir test
zakończy się powodzeniem, a operacja zwróci kod wyjścia 0 .
./configure --prefix=/usr && make && sudo make install
Zwykle znajduje się przy kompilowaniu zadań w celu połączenia wymaganych komend zależnych.
Jeśli spróbujesz wdrożyć powyżej „łańcuchy” z czy - następnie - jeszcze trzeba będzie dużo więcej poleceń i kontroli (a więc więcej kodu napisać - więcej rzeczy się nie udać) dla prostego zadania.
Należy również pamiętać, że łańcuchy poleceń zawierają && i || są odczytywane przez powłokę od lewej do prawej. Konieczne może być grupowanie poleceń i sprawdzanie warunków za pomocą nawiasów, aby uzależnić następny krok od pomyślnego wyniku niektórych poprzednich poleceń. Na przykład zobacz to:
root@debian:$ true || true && false;echo $?
1
#read from left to right
#true OR true=true AND false = false = exit code 1=not success
root@debian:$ true || (true && false);echo $?
0
# true OR (true AND false)=true OR false = true = exit code 0 = success
Lub przykład z życia:
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 ]] && [[ $c -eq 2 ]];echo $?
1
#condition $a = true OR condition b = true AND condition $c = false
#=> yields false as read from left to right, thus exit code=1 = not ok
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 && $c -eq 2 ]];echo $?
0
#vars b and c are checked in a group which returns false,
#condition check of var a returns true, thus true OR false yields true = exit code 0
Należy pamiętać, że niektóre polecenia zwracają różne kody wyjścia w zależności od wykonywanego procesu lub zwracają różne kody w zależności od ich akcji (na przykład polecenie GNU diff
zwraca 1, jeśli dwa pliki się różnią, a 0, jeśli nie). Takie polecenia należy traktować ostrożnie w && i || .
Również po to, aby mieć wszystkie układanki razem, należy pamiętać o łączeniu poleceń za pomocą ;
operatora. W formacie A;B;C
wszystkie polecenia będą wykonywane szeregowo, bez względu na kod wyjścia polecenia A
i B
.