बैश स्क्रिप्ट में सिंगल लाइन [बंद] पर 5 मिनट का प्रदर्शन गिना जाता है


23

मैं 5 मिनट की एक गणना करना चाहूंगा, हर सेकंड को अपडेट करना और उसी लाइन पर परिणाम दिखाना। क्या यह बैश स्क्रिप्टिंग के साथ भी संभव है?


उलटी गिनती क्या करता है? आपको पूरी चीज़ के बारे में थोड़ा और विशिष्ट होने की आवश्यकता है।
एड्रियन फ्रुविर्थ

यह बिलकुल संभव है। यदि आप हमें बताते हैं कि क्यों (किस वास्तविक प्रणाली / नेटवर्क प्रशासन समस्या को आप हल करने का प्रयास कर रहे हैं) तो हम आपको बता सकते हैं कि ऐसा करने के लिए उपलब्ध कई तरीकों में से कौन सा संभवत: आपके लिए सबसे अच्छा काम करेगा। यदि यह एक सामान्य है "मैं इसे एक bashस्क्रिप्ट में कैसे करूँ ? तो आपका प्रश्न शायद यूनिक्स और लिनक्स के लिए बेहतर है - मुझे बताएं और मैं इसे आपके लिए माइग्रेट कर सकता हूं :)
voretaq7

जवाबों:


42

यह बैश शेल से काम करता है:

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

विशेष वर्ण \ 033 [ठीक रेखा के अंत का प्रतिनिधित्व करता है जो बाकी पंक्ति को साफ करता है यदि पिछले आउटपुट से कोई वर्ण बचा हो और \ r एक गाड़ी वापसी हो जो कर्सर को लाइन की शुरुआत में ले जाती है। इस सुविधा के बारे में एक अच्छा सूत्र है stackoverflow.com पर

आप स्वयं के आदेश या जो कुछ भी लूप में जोड़ सकते हैं। यदि आपको कुछ और विशिष्ट चाहिए तो कृपया मुझे और विवरण प्रदान करें।


क्या आप 0K के बजाय ascii-table.com/ansi-escape-fterences.php के अनुसार \ 033 [K का मतलब है ?
जोडी ली ब्रूचॉन

मैंने \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
चिशकु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.