Составные операторы if с несколькими выражениями в Bash

Я хотел бы воссоздать что-то вроде этого

if ( arg1 || arg2 || arg 3) {}

и я дошел до сих пор, но я получаю следующую ошибку

line 11: [.: command not found

if [ $char == $';' -o $char == $'\\' -o $char == $'\'' ]
then ...

Я пробовал разные способы, но ни один из них не работал над некоторыми из тех, которые я пытался

Ответ 1

Для bash вы можете использовать форму [[ ]] а не [ ], что позволяет && и || внутренне:

if [[ foo || bar || baz ]] ; then
  ...
fi

В противном случае вы можете использовать обычные логические логические операторы извне:

[ foo ] || [ bar ] || [ baz ]

... или использовать операторы, специфичные для команды test (хотя современные версии спецификации POSIX описывают это расширение XSI как устаревшее - см. раздел ИСПОЛЬЗОВАНИЕ ПРИМЕНЕНИЯ):

[ foo -o bar -o baz ]

... который является иначе написанной формой следующего, который так же устарел:

test foo -o bar -o baz

Ответ 2

Ответ Чарльза правилен тем, что он показывает вам, как выполнять логические операции над командами внутри (и без этого) выражения if, но это больше похоже на то, что вы хотите использовать case здесь:

case $char in
    \;|\\|\') echo found;;
    *) echo 'not found';;
esac

Ответ 3

Bash [[ ]] и (( )) более мощные и гибкие, чем [ ].

  • [[ ]] для строк, а (( )) для целочисленной логики и арифметики
  • Операторы && и || можно использовать внутри [[ ]] и (( )), а () можно использовать для группировки
  • Не нужно заключать в кавычки расширения переменных внутри [[ ]] или (( )) - Bash не выполняет разбиение слов и не срывает в этих контекстах
  • Внутри (( )) нет необходимости в $ за именами переменных для их расширения
  • [[ ]] и (( )) могут занимать несколько строк без необходимости продолжения строки с помощью \

Используя их, мы можем написать чистый, читаемый и более надежный код.

Примеры

Составные операторы с целыми числами

a=1 b=2 c=3
((a == 2 || (b == 2 && c == 3))) && echo yes                   # yields yes

Составные операторы со строками

x=apple y=mango z=pear
[[ $x == orange || ($y == mango && $z == pear) ]] && echo yes  # yields yes

[эквиваленты для приведенных выше утверждений, используя {}

[ "$a" -eq 2 ] || { [ "$b" -eq 2 ] && [ "$c" -eq 3 ]; }
[ "$x" == orange ] || { [ $y == mango ] && [ "$z" == pear ]; }

Связанные