Tập lệnh Bash đếm ngược 5 phút hiển thị trên một dòng [đã đóng]


23

Tôi muốn đếm ngược 5 phút, cập nhật mỗi giây và hiển thị kết quả trên cùng một dòng. Điều này thậm chí có thể với Bash scripting?


Đếm ngược làm gì? Bạn cần phải cụ thể hơn một chút về toàn bộ.
Adrian Frühwirth

Điều này là hoàn toàn có thể. Nếu bạn cho chúng tôi biết lý do (vấn đề quản trị mạng / hệ thống thực tế nào bạn đang cố gắng giải quyết), chúng tôi có thể cho bạn biết phương pháp nào trong số nhiều phương pháp có sẵn để thực hiện có thể sẽ phù hợp nhất với bạn. Nếu đó là một câu nói chung "Làm thế nào để tôi làm điều này trong một bashkịch bản?" Câu hỏi của bạn có lẽ phù hợp hơn với Unix & Linux - hãy cho tôi biết và tôi có thể di chuyển nó đến đó cho bạn :)
voretaq7

Câu trả lời:


42

Điều này hoạt động từ Bash shell:

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

Ký tự đặc biệt \ 033 [OK đại diện cho phần cuối của dòng giúp dọn sạch phần còn lại của dòng nếu có bất kỳ ký tự nào còn lại từ đầu ra trước đó và \ r là trả về vận chuyển di chuyển con trỏ đến đầu dòng. Có một chủ đề hay về tính năng này tại stackoverflow.com .

Bạn có thể thêm các lệnh riêng hoặc bất cứ điều gì trong vòng lặp while. Nếu bạn cần một cái gì đó cụ thể hơn xin vui lòng cung cấp cho tôi thêm chi tiết.


Ý bạn là \ 033 [K theo ascii-table.com/ansi-escape- resultences.php thay vì 0K?
Jody Lee Bruchon

Tôi đặt \rở đầu để đặt con trỏ ở cuối dòng (điều này ngăn nó ẩn ký tự đầu tiên). Đây là phiên bản cập nhật: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 Cảm ơn
user1067920

13

Đây là một cải tiến về định dạng đầu ra đúng (HH: MM: SS) với các số 0 đứng đầu và giờ hỗ trợ thích hợp:

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

Cung cấp một đầu ra trông như thế này:

02:04:15

Đầu ra không khá HH:MM:SS. Trong vài phút hoặc giây, bạn có thể thấy 00:4:5.
chishaku
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.