Я пытаюсь написать сценарий, который будет проверять два флага ошибок, и в случае изменения одного флага (или обоих) будет эхо- ошибка произошла. Мой сценарий:
my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then
echo "$my_error_flag"
else
echo "no flag"
fi
В принципе, так и должно быть:
if ((a=1 or b=2) or (a=1 and b=2))
then
display error
else
no error
fi
Я получаю ошибку:
line 26: conditional binary operator expected
line 26: syntax error near `]'
line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'
Мои кронштейны испорчены?
bash
if-statement
flags
Просто я
источник
источник
a==1 or b==2
уже охватывает тот случай, когдаa==1 and b==2
. Тестирование отдельно для этого совершенно излишне.Ответы:
Используйте
-a
(для и) и-o
(для или) операции.tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
Обновить
На самом деле вы все еще можете использовать
&&
и||
с-eq
операцией. Итак, ваш сценарий будет выглядеть так:Хотя в вашем случае вы можете отбросить последние два выражения и просто придерживаться одного или операции, например:
источник
[
и]
для группировки (они этого не делают) и невозможность поместить пробелы вокруг оператора (например"$my_error_flag"="1"
), что не позволяет оболочке вообще его распознавать как оператор. Пожалуйста, прочтите BashFAQ № 17 (о группировке) и № 31 (о разнице между различными типами тестовых выражений) . На самом деле, в этом случае было бы еще проще использовать арифметическое выражение .-a
и-o
считаются устаревшими по спецификации POSIX ; использовать отдельные тесты в сочетании с||
как в обновлении.{}
также возможно группирование с использованием .Вы можете использовать любой
[[
или((
ключевое слово. При использовании[[
ключевых слов, вы должны использовать строковые операторы , такие как-eq
,-lt
. Я думаю,((
наиболее предпочтительным для арифметики, потому что вы можете напрямую использовать операторы, такие как==
,<
и>
.Использование
[[
оператораИспользование
((
оператораНе используйте
-a
или-o
операторы, поскольку он не является портативным.источник
Пожалуйста, попробуйте следующее
источник
( ... )
создает подоболочки - большое влияние на производительность без пользы.{ ...; }
для группировки без создания подоболочки.Вы можете получить вдохновение, прочитав
entrypoint.sh
сценарий написанный участниками MySQL, который проверяет, установлены ли указанные переменные.Как показывает сценарий, вы можете передать их
-a
, например:источник
-a
помечен как устаревший в текущей версииtest
стандарта POSIX ; см.OB
маркеры на pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html . Используйте,[ -z "$FOO" ] && [ -z "$BAR" ]
чтобы иметь более надежный код.