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

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.

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

0
Catnip 15 Апр 2020 в 00:35

1 ответ

Лучший ответ

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

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

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

4
John Kugelman 14 Апр 2020 в 21:40