Jeg trengte en tidtaker som starter helt i begynnelsen av skriptet og stopper på slutten.
Kommentarer
Svar
Hvis du vil ha varigheten i sekunder, bruk
start=$SECONDS 
og på slutten
duration=$(( SECONDS - start )) 
Kommentarer
- Hva om det tar mer enn sekunder?
 - @Pithikos Se Philip Gibbons ' s svar nedenfor
 
Svar
 Du kan bruke Linuxs innebygde time kommando. Fra mansiden: 
tid COMMAND [argumenter]
tid bestemmer hvilken informasjon som skal forskyves ay om ressursene som brukes av COMMAND fra strengen FORMAT. Hvis det ikke er angitt noe format på kommandolinjen, men TIME-miljøvariabelen er angitt, brukes dens verdi som format. id = «35bae96fa6″>
skript, bruk:
$ time cleanup.sh 
Kommentarer
-  Vet 
timedu bruker. hackernoon.com/… 
Svar
Jeg skjønner at dette er et ganske gammelt spørsmål, men det er slik jeg gjør det for hva som helst når jeg vil / trenger å vite hvor lang tid det tok å løpe.
 Bash har en innebygd sekunder-timer i form av en intern variabel kalt SECONDS (se:  her  for andre interne variabler) 
 Sett SECONDS=0 før det du sjekker kjøretiden til. Det må være etter brukerinngang for å få et godt resultat så hvis du ber om informasjon, legg den etter ledeteksten (e). 
Sett deretter dette på slutten av det du sjekker:
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 
Hvis du bare vil vite tiden i sekunder, kan du forenkle ovenstående til:
echo "Completed in $SECONDS seconds" 
Som et eksempel:
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 
Kommentarer
-  En snarvei for de som ikke  t vil ha en så forseggjort tidsformatering: 
date +%T -d "1/1 + $SECONDS sec"(begrenset til mindre enn 24 timer, men du kan tilpasse for å legge til dager også) - Utmerket lenke til TLDP ' s Interne variabler . Takk for det!
 
Svar
#!/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}" 
Kommentarer
- Hei, velkommen på Unix SE! Kun kode-koder ser ikke ' ikke veldig bra ut, kanskje du kan forklare hva skriptet ditt gjør.
 - Hvorfor multipliserer du med 1000 her og deler deretter med 1000 * modifikator senere for alle de viste verdiene?
 
Svar
 @anask gjøre en smart løsning for dette svar, bare jeg anbefaler å bruke den innfødte $SECONDS i stedet for å lage en ny 
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}" 
 Formålet med printf og divisjonen er å konvertere de forløpte sekundene til tilsvarende enhet Hours, Mins, Secs, respect. 
Svar
Jeg har nylig prøvd noe lignende. Jeg vil foreslå:
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 
timekommando (tid ./script.sh), for å skrive ut gjeldende tid brukdatekommando og så videre.time yourprogram.sh, som @Marius Cotofana forklarte