Оператор && виконує наступну команду, якщо попередня команда мала успішне виконання, (повертається код виходу ($?) 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
.