Невозможно увеличить переменную в bash сокращенно, если условие другое - PullRequest
0 голосов
/ 15 апреля 2020

В этом примере "нормальный", если еще работает как ожидаемый счетчик приращения:

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 part.

Так в чем же разница?

1 Ответ

4 голосов
/ 15 апреля 2020

Это пример из учебника о том, почему a && b || c плохая идея. Проблема в том, что если b завершится неудачей, он также выполнит c. Вы можете запустить как b, так и c, если проблема не существует.

Это применимо здесь? Это точно так. Смотрите, возвращаемое значение fail_count++ - это значение fail_count до увеличения - 0. И ((0)) считается ошибкой и вызывает его возврат с ненулевым кодом выхода. Который запускает fail_count=0, сбрасывая его обратно в ноль на каждой итерации.

Урок: Избегайте a && b || c. Это коротко. И опасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...