Я работаю с Bash 3, и я пытаюсь сформировать условия. В C / C ++, его мертвым просто: ((A || B) && C)
. В Bash все оказалось не так (я думаю, что авторы Git, должно быть, внесли этот код, прежде чем перейти к другим попыткам).
Это не работает. Обратите внимание, что <0 or 1>
это не строковый литерал; это означает 0 или 1 (как правило, происходит от grep -i
).
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi
Это приводит к:
line 322: syntax error near unexpected token `[['
Я тогда попробовал:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi
это приводит к:
line 322: syntax error near unexpected token `[['
Частично проблема заключается в том, что результаты поиска представляют собой тривиальные примеры, а не более сложные примеры с составными условиями.
Как мне выполнить простую ((A || B) && C)
в Bash?
Я готов просто развернуть его и повторить те же команды в нескольких блоках:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
...
fi
[[ … ]]
был добавлен в bash 2.02.((…))
был добавлен в Bash 2.0.||
и&&
изменить с[
на[[
и((
. Равный приоритет в[
(используйте круглые скобки для управления порядком оценки), но && имеет более высокий приоритет[[
и((
чем||
(как в C).Используйте
[[
:Если вы предпочитаете
[
, следующие работы:источник
Используйте
-o
оператор вместо вашего вложенного ||. Вы также можете использовать-a
для замены &&, если это необходимо в других ваших утверждениях.источник
-a
и-o
, но я не экспериментировал с ними. Кто-то на Stack Overflow сказал, чтобы избежать этого. Я в основном согласен с ними, поскольку сценарий менее читабелен при их использовании[[ ( "$A" -eq "0" || "$B" -ne "0" ) && "$C" -eq "0" ]]
проблемы с ними?bash
или любой другой оболочки, которая понимает[[ ... ]]
.