Potrzebowałem licznika czasu, który będzie zaczynał się na samym początku skryptu i zatrzymywał na końcu.
Komentarze
Odpowiedź
Jeśli chcesz, aby czas trwania był wyrażony w sekundach, na górze użyj
start=$SECONDS
, a na końcu
duration=$(( SECONDS - start ))
Komentarze
- A jeśli zajmie to więcej niż sekundy?
- @Pithikos Zobacz Philip Gibbons ' odpowiedź poniżej
Odpowiedź
Możesz użyć wbudowanego w Linuksa polecenia time
. Ze strony podręcznika:
czas POLECENIE [argumenty]
czas określa, które informacje zostaną przesłane ay o zasobach używanych przez POLECENIE z łańcucha FORMAT. Jeśli format nie jest określony w wierszu poleceń, ale zmienna środowiskowa TIME jest ustawiona, jej wartość jest używana jako format.
Aby ustawić czas cleanup.sh
skrypt, użyj:
$ time cleanup.sh
Komentarze
- Wiem
time
, którego używasz. hackernoon.com/…
Odpowiedź
Zdaję sobie sprawę, że to dość stare pytanie, ale tak właśnie robię to, gdy chcę / chcę wiedzieć, jak długo coś trwało.
Bash ma wbudowany licznik sekund w postaci wewnętrznej zmiennej o nazwie SECONDS
(zobacz: tutaj dla innych zmiennych wewnętrznych)
Umieść SECONDS=0
przed tym, co „ponownie sprawdzasz czas działania. Musi to nastąpić po wprowadzeniu danych przez użytkownika, aby uzyskać dobry wynik, jeśli pytasz o informacje, umieść je po znaku zachęty.
Następnie umieść to na końcu tego, co sprawdzasz:
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
Jeśli chcesz znać czas w sekundach, możesz uprościć powyższe do:
echo "Completed in $SECONDS seconds"
Jako przykład:
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
Komentarze
- Skrót dla tych, którzy nie Nie chcę tak skomplikowanego formatowania czasu:
date +%T -d "1/1 + $SECONDS sec"
(ograniczone do mniej niż 24 godzin, ale możesz dostosować także, dodając dni) - Doskonały link do TLDP ' zmiennych wewnętrznych . Dziękuję za to!
Odpowiedź
#!/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}"
Komentarze
- Cześć, witamy w Unix SE! Odpowiedzi zawierające tylko kod nie ' nie wyglądają bardzo dobrze, może mógłbyś wyjaśnić, co robi twój skrypt.
- Dlaczego tutaj mnożysz przez 1000, a następnie dzielisz przez 1000 * modyfikator później dla wszystkich wyświetlanych wartości?
Odpowiedź
@anask zrobić sprytne rozwiązanie tego problemu Odpowiedź, po prostu zalecam użycie natywnego $SECONDS
zamiast utworzenia nowego
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}"
Celem printf
, a podział polega na konwersji sekund, które upłynęły, na odpowiadające im godziny, minuty, sekundy, odpowiednio.
Odpowiedź
Ostatnio próbowałem czegoś podobnego. Proponuję:
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
(time ./script.sh), do wydrukowania aktualnego czasu użyj poleceniadate
i tak dalej.time yourprogram.sh
, które @Marius Cotofana wyjaśnił