Я хотел бы отсчет 5 минут, обновлять каждую секунду и отображать результат в той же строке. Возможно ли это вообще с помощью сценариев Bash?
Это работает из оболочки Bash:
secs=$((5 * 60))
while [ $secs -gt 0 ]; do
echo -ne "$secs\033[0K\r"
sleep 1
: $((secs--))
done
Особый персонаж \ 033 [0K представляет конец строки, которая очищает оставшуюся часть строки, если от предыдущего вывода остались какие-либо символы и \р - возврат каретки, перемещающий курсор в начало строки. Есть хорошая ветка об этой функции на stackoverflow.com.
Вы можете добавлять собственные команды или что угодно в цикле while. Если вам нужно что-то более конкретное, сообщите мне подробности.
Вот пример с улучшенным правильным форматом вывода (ЧЧ: ММ: СС) с правильными ведущими нулями и вспомогательными часами:
#!/bin/bash
m=${1}-1 # add minus 1
Floor () {
DIVIDEND=${1}
DIVISOR=${2}
RESULT=$(( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ))
echo ${RESULT}
}
Timecount(){
s=${1}
HOUR=$( Floor ${s} 60/60 )
s=$((${s}-(60*60*${HOUR})))
MIN=$( Floor ${s} 60 )
SEC=$((${s}-60*${MIN}))
while [ $HOUR -ge 0 ]; do
while [ $MIN -ge 0 ]; do
while [ $SEC -ge 0 ]; do
printf "%02d:%02d:%02d\033[0K\r" $HOUR $MIN $SEC
SEC=$((SEC-1))
sleep 1
done
SEC=59
MIN=$((MIN-1))
done
MIN=59
HOUR=$((HOUR-1))
done
}
Timecount $m
Дает следующий результат:
02:04:15