Dla bash timera używam tego kodu:
#!/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!"
To daje mi coś takiego
One Moment please: 60 59 58 57 56 55 ...
Czy istnieje możliwość zastąpienia ostatniej wartości sekundy najnowszą, aby wynik nie generował dużego śladu, ale odliczanie sekund jak w czasie rzeczywistym w jednej pozycji? (Mam nadzieję, że rozumiesz o co mi chodzi :))
watch
polecenia, chociaż nie jestem pewien, jak to zrobić.Odpowiedzi:
źródło
\r
. Zobacz moją odpowiedź.The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
. Zamiast tego użyj POSIX$((expression))
lub((
-command. Npsek=$(( sek - 1 ))
lub(( sek = sek - 1 ))
lub(( sek-- ))
.Zasadniczo to samo co odpowiedź aneeshep, ale używa Return (
\r
) zamiast Backspace (\b
), ponieważ nie wiemy, czy długość zawsze będzie taka sama, np$sek < 10
. Kiedy .Również twój pierwszy
echo
powinien używać$sek
, a nie na stałe60
.Na koniec zwróć uwagę na miejsce po
...
.źródło
W bash możesz użyć specjalnej zmiennej
SECONDS
.źródło
SECONDS
Ta zmienna rozwija się do liczby sekund od uruchomienia powłoki. (więc prawdopodobnie nieOprócz
\r
lub\b
zbliża się możliwe jest użycie\033[2K
znaku kontrolnego , który każe terminalowi wyczyścić całą linię. Zaletą tego\b
jest to, że nie musisz dopasowywać liczby\b
do liczby znaków, które chcesz usunąć, a w porównaniu do\r
nie będzie znaków wystających na ekranie, jeśli nowa linia jest krótsza niż stara jeden.Poniżej znajduje się przykład, w jaki sposób można go zastosować do tego pytania, a oto przykład pokrewnej aplikacji do tworzenia danych wyjściowych podobnych do komunikatów rozruchowych. W tym konkretnym przykładzie minutnik zniknie po osiągnięciu 0 sekundy, a linia timera zostanie zastąpiona przez „Gotowy!” wyrażenie.
Inną alternatywą byłoby użycie
dialog
polecenia do tworzenia prostych okien dialogowych w wierszu poleceń. Okno dialogowe pozostanie na ekranie przez czas trwania timera i zaktualizuje się w pętli, a do czasu, gdy się skończy - timer zostanie zastąpiony komunikatem „Gotowe! Naciśnij, aby wyjść” w płynny sposób:źródło
dialog
nie istnieje na komputerze Mac: /Oto, co wymyśliłem po przeczytaniu tutaj i trochę więcej, jeden linijka:
Bardziej czytelny:
Gdzie SEC można ustawić na dowolną dodatnią liczbę całkowitą, a printf zajmie się odpowiednim dopełnieniem. Testowane pod Ubuntu i cygwin.
źródło
Można to osiągnąć poprzez umieszczenie zwrotu karetki
\r
.W jednym wierszu kodu jest to możliwe za pomocą
echo -ne
lub z
printf
źródło
Minutnik:
a „normalny” stoper to:
Ctrl + C, aby zatrzymać
źródło