Перезаписать предыдущий вывод в Bash вместо добавления его

Для таймера 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 ... 

Есть ли возможность заменить последнее значение второго на самое последнее, чтобы выход не генерировал большой след, а отсчет секунд как в реальном времени в одной позиции? (Надеюсь, ты понимаешь, что я имею в виду :))

 #!/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] echo -en "\b\b" done echo echo "ready!" 

В основном то же, что и ответ aneeshep, но использует Return ( \r ), а не Backspace ( \b ), потому что мы не знаем, будет ли длина всегда одинаковой, например, когда $sek < 10 .

Кроме того, ваше первое echo должно использовать $sek , а не hard-code 60 .

Наконец, обратите внимание на пробел после ...

 #!/bin/bash sek=60 echo "$sek Seconds Wait!" while [ $sek -ge 1 ] do echo -ne "One Moment please $sek ... \r" sleep 1 sek=$[$sek-1] done echo echo "ready!" 

С помощью bash вы можете использовать специальную переменную SECONDS .

 #BASH SECONDS=0; while sleep .5 && ((SECONDS <= 60)); do printf '\r%s: %2d' "One moment please" "$((60-SECONDS))" done printf '\n' 

Это то, что я придумал после прочтения здесь и немного больше, один лайнер:

 SEC=101;for i in `seq $SEC -1 1`;do printf "\rNext in: %`expr length $SEC`ds" "$i";sleep 1;done;echo 

Более читаемые:

 #!/bin/bash SEC=101 for i in `seq $SEC -1 1`;do printf "\rNext in: %`expr length $SEC`ds" "$i"; sleep 1; done echo 

Если SEC может быть настроен на любое положительное целое число, и printf позаботится о соответствующем заполнении. Протестировано под Ubuntu и cygwin.

Таймер обратного отсчета:

 MIN=1 && for i in $(seq $(($MIN*60)) -1 1); do echo -n "$i, "; sleep 1; done; echo -e "nnMessage" 

и «нормальный» секундомер:

 START=$( date +%s ); while true; do CURRENT=$( date +%s ) ; echo $(( CURRENT-START )) ; sleep 1 ; echo -n ; done 

контроль + c для остановки