Оператор && выполняет следующую команду, если предыдущая команда прошла успешно (возвращенный код выхода ($?) 0 = логическое истина).
В форме A && B || C
команда (или условие) A оценивается, и если A возвращает true (успех, код выхода 0), то команда B выполняется. Если A потерпит неудачу (таким образом, вернет false - код выхода, отличный от 0), и / или B завершится неудачно ( вернет false ), тогда будет выполнена команда C.
Также &&
оператор используется как AND в проверках условий, а оператор ||
работает как OR в проверках условий.
В зависимости от того, что вы хотите сделать со своим сценарием, форму A && B || C
можно использовать для проверки условий, как в вашем примере, или можно использовать для цепочки команд и обеспечения выполнения серии команд, если предыдущие команды имели успешный код завершения 0 .
Именно поэтому часто можно увидеть такие команды , как:
do_something && do_something_else_that_depended_on_something
.
Примеры:
apt-get update && apt-get upgrade
если обновление завершится неудачно, то обновление не будет выполнено (имеет смысл в реальном мире ...).
mkdir test && echo "Something" > test/file
Эта часть echo "Something"
будет выполнена, только если она mkdir test
прошла успешно и операция вернула код завершения 0 .
./configure --prefix=/usr && make && sudo make install
Обычно встречается при компиляции заданий для объединения необходимых зависимых команд.
Если вы попытаетесь реализовать вышеупомянутые «цепочки» с помощью if - then - иначе вам понадобится гораздо больше команд и проверок (и, следовательно, больше кода для написания - больше ошибок) для простой задачи.
Также имейте в виду, что связанные команды с && и || читаются оболочкой слева направо. Вам может потребоваться сгруппировать команды и проверки условий в скобках, чтобы следующий шаг зависел от успешного вывода некоторых предыдущих команд. Например, посмотрите это:
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
Или пример из реальной жизни:
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
Имейте в виду, что некоторые команды возвращают разные коды выхода в зависимости от выполняемого процесса или возвращают разные коды в зависимости от их действий (например, команда GNU diff
возвращает 1, если два файла различаются, и 0, если их нет). К таким командам нужно относиться с осторожностью в && и || ,
Также просто, чтобы собрать всю головоломку, помните о конкатенации команд с помощью ;
оператора. В формате A;B;C
все команды будут выполняться последовательно, независимо от того, какой был код выхода команды A
и B
.