Оператор && виконує наступну команду, якщо попередня команда мала успішне виконання, (повертається код виходу ($?) 0 = логічно вірно).
За формою оцінюється A && B || Cкоманда (або умова) A , і якщо A повертає справжнє (успіх, код виходу 0), тоді виконується команда B. Якщо A не вдасться (таким чином поверне false - код виходу, відмінний від 0) та / або B не вдасться (повернення false ), тоді буде виконана команда C.
Також &&оператор використовується як AND у перевірках стану, і оператор ||працює як АБО у перевірках стану.
Залежно від того, що ви хочете зробити зі своїм сценарієм, форма 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 - то - else, вам буде потрібно набагато більше команд і перевірок (і, таким чином, більше коду для запису - більше речей, щоб піти не так) для простого завдання.
Також пам’ятайте, що прикуті команди з && та || читаються оболонкою зліва направо. Можливо, вам доведеться згрупувати команди та перевірки стану за допомогою дужок, щоб залежати наступний крок від успішного виведення деяких попередніх команд. Наприклад, дивіться це:
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.