Skrip Bash menghitung mundur tampilan 5 menit pada satu baris [tertutup]


23

Saya ingin menghitung mundur 5 menit, memperbarui setiap detik dan menunjukkan hasilnya pada baris yang sama. Apakah ini mungkin dengan scripting Bash?


Apa yang dilakukan hitung mundur? Anda harus sedikit lebih spesifik tentang semuanya.
Adrian Frühwirth

Ini sangat mungkin. Jika Anda memberi tahu kami alasannya (masalah administrasi sistem / jaringan apa yang sedang Anda coba selesaikan) kami dapat memberi tahu Anda yang mana dari banyak metode yang tersedia untuk melakukannya yang mungkin akan bekerja paling baik untuk Anda. Jika ini adalah umum "Bagaimana saya melakukan ini dalam bashskrip?` Pertanyaan pertanyaan Anda mungkin lebih cocok untuk Unix & Linux - beri tahu saya dan saya dapat memigrasikannya di sana untuk Anda :)
voretaq7

Jawaban:


42

Ini bekerja dari Bash shell:

secs=$((5 * 60))
while [ $secs -gt 0 ]; do
   echo -ne "$secs\033[0K\r"
   sleep 1
   : $((secs--))
done

Karakter khusus \ 033 [OK mewakili akhir baris yang membersihkan sisa baris jika ada karakter yang tersisa dari keluaran sebelumnya dan \ r adalah pengembalian carriage yang menggerakkan kursor ke awal baris. Ada utas bagus tentang fitur ini di stackoverflow.com .

Anda dapat menambahkan perintah sendiri atau apa pun di loop sementara. Jika Anda membutuhkan sesuatu yang lebih spesifik, berikan saya detail lebih lanjut.


Apakah maksud Anda \ 033 [K sesuai ascii-table.com/ansi-escape-afterences.php alih-alih 0K?
Jody Lee Bruchon

Saya meletakkan \rdi awal untuk meletakkan kursor di akhir baris (yang mencegahnya menyembunyikan karakter pertama). Berikut ini adalah versi terbaru: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 Terima kasih
user1067920

13

Inilah satu dengan peningkatan format output kanan (HH: MM: SS) dengan nol terkemuka terkemuka dan jam pendukung:

#!/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

Memberikan output yang terlihat seperti ini:

02:04:15

Outputnya tidak cukup HH:MM:SS. Untuk satu digit menit atau detik, Anda bisa melihatnya 00:4:5.
chishaku
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.