Я знаю, что &&
- это И, а ||
- ИЛИ. Но как они работают друг с другом, если их несколько? См. (Утверждения заменены числами):
if 1 && 2 || 3 && 4
->
1) (1 AND 2) OR (3 AND 4)
2) 1 AND (2 OR 3) AND 4
if 1 && 2 || 3 && 4 || 5 && 6
->
1) (1 AND 2) OR (3 AND 4) OR (5 AND 6)
2) 1 AND (2 OR 3) AND (4 OR (5 AND 6))
etc. etc.
Итак: Как работают множественные &&
и ||
? Есть ли порядок (например, &&
всегда выше ||
), или просто «слева направо», или что-то еще? Что, если оператор if работает как вариант 1, а вы хотите, чтобы он работал как вариант 2? Что же тогда делать?
@B.Ответ Таннера имеет правильное объяснение о приоритете оператора . Они работают просто слева направо.
Для ваших примеров это означает:
if 1 && 2 || 3 && 4
--> (((1 && 2) || 3) && 4)
if 1 && 2 || 3 && 4 || 5 && 6
--> (((((1 && 2) || 3) && 4) || 5) && 6)
Если какая-либо оценка не удалась, bash
не учитывает остальное.
На жаргоне компьютерных наук это называется "приоритет оператора", и если вы поищете в man bash
precedence
, то найдете ответ на свой вопрос:
Expressions may be combined using the following operators,
listed in decreasing order of precedence:
( expression )
Returns the value of expression. This may be used to
override the normal precedence of operators.
! expression
True if expression is false.
expression1 && expression2
True if both expression1 and expression2 are true.
expression1 || expression2
True if either expression1 or expression2 is true.
The && and || operators do not evaluate expression2 if the value
of expression1 is sufficient to determine the return value of
the entire conditional expression.
Обратите внимание на последний бит... если вы напишете "if true || something", то "something" никогда не будет выполнено.