Ik had een timer nodig die aan het begin van het script begint en aan het einde stopt.
Opmerkingen
Antwoord
Als je de duur in seconden wilt, gebruik dan bovenaan
start=$SECONDS
en aan het einde
duration=$(( SECONDS - start ))
Reacties
- Wat als het meer dan seconden duurt?
- @Pithikos Zie Philip Gibbons ' s antwoord hieronder
Antwoord
Je zou Linux” s ingebouwde time
commando kunnen gebruiken. Vanaf de man-pagina:
tijd COMMAND [argumenten]
tijd bepaalt welke informatie moet worden weergegeven ay over de bronnen die worden gebruikt door de COMMAND van de string FORMAT. Als er geen indeling is opgegeven op de opdrachtregel, maar de omgevingsvariabele TIME is ingesteld, wordt de waarde ervan gebruikt als indeling.
Om de cleanup.sh
script, gebruik:
$ time cleanup.sh
Reacties
- Weet de
time
die u gebruikt. hackernoon.com/…
Antwoord
Ik realiseer me dat dit een vrij oude vraag is, maar dit is de manier waarop ik het voor alles doe als ik wil / moet weten hoe lang het duurde voordat iets liep.
Bash heeft een ingebouwde seconden timer in de vorm van een interne variabele genaamd SECONDS
(zie: hier voor andere interne variabelen)
Zet SECONDS=0
voor datgene waarvan je de looptijd controleert. Het moet na elke gebruikersinvoer zijn om een goed resultaat te krijgen als u “om informatie vraagt, plaats het dan achter de prompt (s).
Zet dit dan aan het einde van wat u” aan het controleren bent:
if (( $SECONDS > 3600 )) ; then let "hours=SECONDS/3600" let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" elif (( $SECONDS > 60 )) ; then let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $minutes minute(s) and $seconds second(s)" else echo "Completed in $SECONDS seconds" fi
Als u alleen de tijd in seconden wilt weten, kunt u het bovenstaande vereenvoudigen tot:
echo "Completed in $SECONDS seconds"
Als voorbeeld:
read -rp "What"s your name? " "name" SECONDS=0 echo "Hello, $name" if (( $SECONDS > 3600 )) ; then let "hours=SECONDS/3600" let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" elif (( $SECONDS > 60 )) ; then let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $minutes minute(s) and $seconds second(s)" else echo "Completed in $SECONDS seconds" fi
Reacties
- Een snelkoppeling voor degenen die geen Ik wil zon uitgebreide tijdopmaak:
date +%T -d "1/1 + $SECONDS sec"
(beperkt tot minder dan 24 uur, maar je kunt ook aanpassen om dagen toe te voegen) - Uitstekende link naar TLDP ' s interne variabelen . Bedankt daarvoor!
Antwoord
#!/bin/bash start=$(date +%s) # # do something sleep 10 # # end=$(date +%s) seconds=$(echo "$end - $start" | bc) echo $seconds" sec" echo "Formatted:" awk -v t=$seconds "BEGIN{t=int(t*1000); printf "%d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}"
Opmerkingen
- Hallo, welkom op de Unix SE! Antwoorden met alleen code ' zien er niet erg goed uit, misschien kun je uitleggen wat je script doet.
- Waarom vermenigvuldig je hier met 1000 en deel je dan door 1000 * modifier later voor alle weergegeven waarden?
Answer
@anask doe hier een slimme oplossing voor antwoord, ik raad alleen aan om in plaats daarvan de native $SECONDS
te gebruiken om een nieuwe te maken
awk -v t=$SECONDS "BEGIN{t=int(t*1000); printf "Elapsed Time (HH:MM:SS): %d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}"
Het doel van de printf
en de deling is om de verstreken seconden om te rekenen naar de corresponderende eenheid Uren, minuten, seconden, respectievelijk.
Antwoord
Ik heb onlangs iets soortgelijks geprobeerd. Ik zou willen voorstellen:
date1=$(date +%s) #Use this arithmetic to determine elapsed time since defining date1 $(( $(date +%s) - $date1 )) #While loop using timer while ! [ $(( $(date +%s) - $date1 )) -gt 10 ]; do #Terminal timer -n won"t append new line, so the echo will replace itself. ##There is also some date formatting to achieve: HH:MM:SS. echo -ne "$(date -u --date @$(( $(date +%s) - $date1 )) +%H:%M:%S)\r" done
time
commando (time ./script.sh) om de werktijd van het script te meten, gebruik hetdate
commando om de huidige tijd af te drukken, enzovoort.time yourprogram.sh
, die @Marius Cotofana heeft uitgelegd