Почему добавление спящего режима в сценарий bash, по-видимому, нарушает уменьшение переменной для определенных именованных переменных?

С помощью следующего скрипта bash:

#!/bin/bash
let SECONDS=5

until [[ "$SECONDS" -le "1" ]]; do
    echo SECONDS $SECONDS
    (( SECONDS -= 1 ))

#    sleep 1
done

Я вижу странное поведение. А именно, если я раскомментирую sleep 1 цикл продолжается, но счетчик не уменьшается, я вижу вывод как:

$./mvce.sh 
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5

Удаление этой строки приводит к ожидаемому:

$./mvce.sh 
SECONDS 5
SECONDS 4
SECONDS 3
SECONDS 2

Я не совсем уверен, почему это происходит. Я могу переименовать переменную во что-то другое, и все будет работать так, как ожидается, поэтому кажется, что sleep ломает мой SECONDS переменная.

Это было удивительно, почему вызов сна отменяет SECONDS переменная в моем сценарии?

1 ответ

SECONDS является зарезервированной переменной в оболочке. Вот почему вы всегда должны использовать строчные или смешанные переменные в вашем скрипте и избегать использования всех имен переменных в верхнем регистре.

#!/bin/bash
let secs=5

until [[ "$secs" -le "1" ]]; do
    echo SECONDS $secs
    (( secs -= 1 ))

   sleep 1
done

Это дает ожидаемый результат:

SECONDS 5
SECONDS 4
SECONDS 3
SECONDS 2

Doumentation:

СЕКУНД
При каждом обращении к этому параметру возвращается количество секунд с момента вызова оболочки. Если значение присваивается SECONDS, значением, возвращаемым при последующих ссылках, является количество секунд с момента назначения плюс назначенное значение. Если SECONDS не установлен, он теряет свои специальные свойства, даже если впоследствии он сбрасывается.

Другие вопросы по тегам