Составные операторы 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 ]; }
Связанные