สคริปต์ทุบตีนับถอยหลังแสดง 5 นาทีในบรรทัดเดียว [ปิด]


23

ฉันต้องการนับถอยหลัง 5 นาทีอัปเดตทุกวินาทีและแสดงผลลัพธ์ในบรรทัดเดียวกัน เป็นไปได้ด้วยการใช้สคริปต์ Bash หรือไม่


การนับถอยหลังทำอะไร คุณต้องมีความเฉพาะเจาะจงมากขึ้นเกี่ยวกับเรื่องทั้งหมด
Adrian Frühwirth

นี่เป็นไปได้อย่างแน่นอน หากคุณบอกเราว่าเหตุใด (ปัญหาการบริหารระบบ / เครือข่ายที่เกิดขึ้นจริงที่คุณกำลังพยายามแก้ไข) เราสามารถบอกได้ว่าวิธีใดที่ใช้ได้หลายวิธีที่จะทำได้ดีที่สุดสำหรับคุณ ถ้าเป็นแบบทั่วไป "ฉันจะทำสิ่งนี้ในbashสคริปต์ได้อย่างไร" คำถามที่คำถามของคุณน่าจะเหมาะกับUnix & Linux - แจ้งให้เราทราบและฉันสามารถโยกย้ายไปที่นั่นเพื่อคุณ :)
voretaq7

ต่อไปนี้เป็นวิธีgithub.com/himanshub16/MyScripts/blob/master/countdown.sh
Himanshu Shekhar

คำตอบ:


42

ใช้งานได้จาก Bash shell:

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

อักขระพิเศษ\ 033 [OKหมายถึงจุดสิ้นสุดของบรรทัดซึ่งล้างส่วนที่เหลือของบรรทัดหากมีอักขระใด ๆ ที่เหลือจากเอาต์พุตก่อนหน้าและ\ rคือการขึ้นบรรทัดใหม่ซึ่งเลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัด มีหัวข้อที่ดีเกี่ยวกับคุณลักษณะนี้ที่stackoverflow.com

คุณสามารถเพิ่มคำสั่งของตัวเองหรืออะไรก็ได้ในขณะที่ลูป หากคุณต้องการสิ่งที่เฉพาะเจาะจงมากขึ้นโปรดแจ้งรายละเอียดเพิ่มเติมให้ฉัน


คุณหมายถึง \ 033 [K as per ascii-table.com/ansi-escape-sequences.phpแทนที่จะเป็น 0K หรือไม่
Jody Lee Bruchon

ฉันใส่\rที่จุดเริ่มต้นเพื่อวางเคอร์เซอร์ที่ท้ายบรรทัด (ซึ่งป้องกันไม่ให้ซ่อนอักขระตัวแรก) นี่คือรุ่นที่อัปเดตแล้ว: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 ขอบคุณ
user1067920

13

นี่คือรูปแบบหนึ่งที่มีการปรับปรุงรูปแบบเอาต์พุตที่ถูกต้อง (HH: MM: SS) ด้วยค่าศูนย์นำและชั่วโมงการสนับสนุนที่เหมาะสม:

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

HH:MM:SSการส่งออกไม่มาก 00:4:5นาทีหลักเดียวหรือไม่กี่วินาทีคุณจะได้เห็น
chishaku
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.