Untuk penghitung waktu bash, saya menggunakan kode ini:
#!/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!"
Itu memberi saya sesuatu seperti itu
One Moment please: 60 59 58 57 56 55 ...
Apakah ada kemungkinan untuk mengganti nilai terakhir dari detik dengan yang terbaru sehingga output tidak menghasilkan jejak besar tetapi hitungan detik seperti waktu nyata pada satu posisi? (Semoga Anda mengerti apa yang saya maksud :))
watch
perintah, meskipun saya tidak yakin bagaimana melakukannya.Jawaban:
sumber
\r
. Lihat jawaban saya.The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
. Gunakan POSIX$((expression))
atau((
perintah-sebagai gantinya. Misalnyasek=$(( sek - 1 ))
atau(( sek = sek - 1 ))
atau(( sek-- ))
.Pada dasarnya sama dengan jawaban aneeshep, tetapi menggunakan Return (
\r
) daripada Backspace (\b
) karena kita tidak tahu apakah panjangnya akan selalu sama, misalnya kapan$sek < 10
.Juga, yang pertama Anda
echo
harus gunakan$sek
, bukan hard-code60
.Akhirnya, perhatikan spasi setelah
...
.sumber
Dengan bash Anda dapat menggunakan variabel khusus
SECONDS
.sumber
SECONDS
Variabel ini meluas ke jumlah detik sejak shell dimulai. (jadi saya mungkin tidak akan mengaturnya ke 0 .. hanya mengujinya selama 60 detik lebih dari saat skrip dimulai) .. +1Selain
\r
atau\b
pendekatan, dimungkinkan untuk menggunakan\033[2K
karakter kontrol , yang memberitahu terminal untuk menghapus seluruh baris. Keuntungan dari ini dibandingkan\b
adalah bahwa Anda tidak harus mencocokkan jumlah\b
dengan jumlah karakter yang ingin Anda hapus, dan dibandingkan dengan itu\r
tidak akan ada karakter yang mencuat di layar jika baris baru lebih pendek daripada yang lama satu.Di bawah ini adalah contoh bagaimana hal itu dapat diterapkan pada pertanyaan ini, dan di sini adalah contoh aplikasi terkait untuk membuat output yang mirip dengan pesan boot. Dalam contoh khusus ini, timer akan hilang begitu 0 detik tercapai dan garis timer akan diganti dengan "Siap!" frasa.
Alternatif lain adalah menggunakan
dialog
perintah untuk membuat dialog sederhana di command-line. Dialog akan tetap di layar selama durasi timer dan diperbarui dengan loop, dan pada saat itu selesai - timer akan diganti dengan pesan "Ready! Tekan untuk keluar" dengan cara yang mulus:sumber
dialog
tidak ada di mac: /Inilah yang saya dapatkan setelah membaca di sini dan sedikit lagi, liner:
Lebih mudah dibaca:
Di mana SEC dapat diatur ke bilangan bulat positif apa pun dan printf akan menangani padding yang sesuai. Diuji di bawah Ubuntu dan cygwin.
sumber
Dapat mencapainya dengan menempatkan carriage return
\r
.Dalam satu baris kode, dimungkinkan dengan
echo -ne
atau dengan
printf
sumber
Penghitung waktu mundur:
dan stopwatch 'normal' adalah:
kontrol + c untuk berhenti
sumber