Я хочу сделать что-то вроде ниже в bash script. как реализовать в синтаксисе bash.
if !((a==b) && (a==c))
then
do something
end if
Я хочу сделать что-то вроде ниже в bash script. как реализовать в синтаксисе bash.
if !((a==b) && (a==c))
then
do something
end if
Для цифрового сравнения вы можете:
if ! (( (a == b) && (a == c) ))
Для сравнения строк:
if ! [[ "$a" == "$b" && "$a" == "$c" ]]
В Bash двойные круглые скобки устанавливают арифметический контекст (в котором знаки доллара в основном являются необязательными, для сравнения) (также используется в арифметическом расширении for ((i=0; i<=10; i++))
и $(())
) и используется для отличить последовательность от набора одиночных круглых скобок, которая создает подоболочку.
Это, например, выполняет команду true
и, поскольку она всегда верна, она выполняет действие:
if (true); then echo hi; fi
Это то же самое, что и
if true; then echo hi; fi
за исключением того, что создается подоболочка. Однако if ((true))
проверяет значение переменной с именем "true".
Если бы вы включили знак доллара, то "$ true" однозначно будет переменной, но поведение if
с одиночными круглыми скобками (или без круглых скобок) изменится.
if ($true)
или
if $true
будет выполнять содержимое переменной как команду и выполнить условное действие на основе значения выхода команды (или дать сообщение "не найдена команда", если содержимое не является допустимой командой).
if (($true))
делает то же, что и if ((true))
, как описано выше.
if [ "$a" != "$b" -o "$a" != "$c" ]; then
# ...
else
# ...
fi
#!/bin/bash
a=2
b=3
c=4
if ! (( (a == b) && (a == c) )); then
# stuff here
fi
Вы также можете использовать следующее, которое я лично считаю более понятным:
#!/bin/bash
a=2
b=3
c=4
if (( (a != b) || (a != c) )); then
# stuff here
fi
Технически вам не нужны парсеры вокруг вспомогательных выражений, так как операторы равенства == !=
имеют более высокий приоритет, чем оба составных оператора сравнения && ||
, но я думаю, что разумно держать их там, чтобы показать намерение, если ничего иначе.