В этом примере "нормально", если еще работает ожидаемое увеличение счетчика:
fail_count=0
for i in {1..1000}; do
curl --fail -sL "$URL/$i"
if [ $? -ne 0 ]; then ((fail_count++)); else fail_count=0; fi
echo $fail_count
[[ $fail_count -eq 10 ]] && exit 0
done
И здесь значение fail_count
всегда равно 0:
fail_count=0
for i in {1..1000}; do
curl --fail -sL "$URL/$i"
[[ $? -ne 0 ]] && ((fail_count++)) || fail_count=0
echo $fail_count
[[ $fail_count -eq 10 ]] && exit 0
done
Увеличение работает, когда переменная счетчика не установлена в части || fail_count=0
.
Так в чем разница?
1 ответ
Это пример из учебника, объясняющий, почему a && b || c
плохая идея. Проблема в том, что если b
выйдет из строя, он также выполнит c
. Вы можете запустить как b
, так и c
, проблемы «если-то-еще» не возникает.
Это применимо здесь? Несомненно. Видите, возвращаемое значение fail_count++
- это значение fail_count
до увеличения - 0
. И ((0))
считается ошибкой и приводит к возврату с ненулевым кодом выхода. Что запускает fail_count=0
, сбрасывая его на ноль на каждой итерации.
Урок: Избегайте a && b || c
. Это коротко. И опасно.
Похожие вопросы
Новые вопросы
bash
Для вопросов о скриптах, написанных для командной оболочки Bash. Для сценариев оболочки с ошибками / синтаксическими ошибками, пожалуйста, проверьте их с помощью программы shellcheck (или на сервере веб-проверки оболочки по адресу https://shellcheck.net) перед размещением здесь. Вопросы об интерактивном использовании Bash, скорее всего, будут касаться темы Super User, а не переполнения стека.