Почему добавление спящего режима в сценарий 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 не установлен, он теряет свои специальные свойства, даже если впоследствии он сбрасывается.