Для таймера Bash я использую этот код:
#!/bin/bash
sek=60
echo "60 Seconds Wait!"
echo -n "One Moment please "
while [ $sek -ge 1 ]
do
echo -n "$sek "
sleep 1
sek=$[$sek-1]
done
echo
echo "ready!"
Это дает мне что-то подобное
One Moment please: 60 59 58 57 56 55 ...
Есть ли возможность заменить последнее значение секунды на самое последнее, чтобы результат не создавал большой след, а считал секунды, как в реальном времени на одной позиции? (Надеюсь, вы понимаете, что я имею в виду :))
watch
команды, хотя я точно не знаю, как это сделать.Ответы:
источник
\r
. Смотри мой ответ.The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
. Вместо этого используйте POSIX$((expression))
или((
-команду. Например,sek=$(( sek - 1 ))
или(( sek = sek - 1 ))
или(( sek-- ))
.По сути то же самое, что и ответ aneeshep, но использует Return (
\r
), а не Backspace (\b
), потому что мы не знаем, будет ли длина всегда одинаковой, например когда$sek < 10
.Кроме того, ваш первый
echo
должен использовать$sek
, а не жесткий код60
.Наконец, обратите внимание на пробел после
...
.источник
С Bash вы можете использовать специальную переменную
SECONDS
.источник
SECONDS
Эта переменная увеличивается до количества секунд, прошедших с момента запуска оболочки. (поэтому я, вероятно, не установил бы его в 0 .. просто протестируйте его еще на 60 секунд с момента запуска сценария) .. +1В дополнение к
\r
или\b
подходам можно использовать\033[2K
управляющий символ , который сообщает терминалу очистить всю строку. Преимущество этого по сравнению с тем\b
, что вам не нужно сопоставлять количество\b
с количеством символов, которые вы хотите удалить, и по сравнению с тем,\r
что на экране не будет выпуклых символов, если новая строка короче старой один.Ниже приведен пример того, как его можно применить к этому вопросу, а вот пример соответствующего приложения для создания вывода, аналогичного загрузочным сообщениям. В этом конкретном примере таймер исчезнет, когда будет достигнута 0-я секунда, и строка таймера будет заменена на «Готово!» фраза.
Другой альтернативой будет использование
dialog
команды для создания простых диалогов в командной строке. Диалог будет оставаться на экране в течение всего времени таймера и обновляться с помощью цикла, а к тому времени, когда он будет сделан, таймер будет заменен на сообщение «Готово! Нажмите для выхода» без проблем:источник
dialog
не существует на Mac: /Это то, что я придумал после прочтения здесь и немного больше, один вкладыш:
Более читабельно:
Где SEC может быть установлен на любое положительное целое число, и printf позаботится о соответствующем заполнении. Протестировано под Ubuntu и Cygwin.
источник
Можно добиться этого путем размещения возврата каретки
\r
.В одной строке кода это возможно с
echo -ne
или с
printf
источник
Таймер обратного отсчета:
и «нормальный» секундомер:
Ctrl + C, чтобы остановить
источник