How Do I Use $Seconds Inside a Bash Script?

How Do I Use $Seconds Inside a Bash Script?

I want to save the result of the $SECONDS command into a variable, to print time in format HH:MM:SS.

This is what I've tried so far. I tried to print it in different ways and was always getting the result as 0:

time_spent="$SECONDS"
echo "Time: $time_spent"

I want to print time spent in the shell when I close my console. I created a script that runs every time the console was closed.

1

4 Answers

To get $SECONDS into HH:MM:SS format you will need to do some (integer) math:

secs=$SECONDS
hrs=$(( secs/3600 )); mins=$(( (secs-hrs*3600)/60 )); secs=$(( secs-hrs*3600-mins*60 ))

printf 'Time spent: %02d:%02d:%02d\n' $hrs $mins $secs
Time spent: 431:48:03
4

You've referenced the bash internal variable SECONDS (which outputs the number of seconds elapsed since the current instance of shell is invoked) and saved the value as another variable time_spent. Now, after that every time you check the value of variable time_spent, you would get the same value -- the saved one, at the time of expansion of SECONDS.

To dynamically get SECONDS, you should reference $SECONDS directly rather than using an intermediate variable:

echo "Time: $SECONDS"

If you insist on using an intermediate variable, make sure to do the expansion of $SECONDS every time.


Regarding the value of SECONDS being 0, you can easily reproduce this:

% bash -c 'echo $SECONDS'
0

The point is: when you're calculating the value, it's not a second yet, so the value is being 0, correctly.

2

If you're sure that $SECONDS will be less than 1 day (i.e. 86400 seconds), then GNU core-utils date does a pretty good job of the required formatting:

$ date -ud "@$SECONDS" "+Time elapsed: %H:%M:%S"
Time elapsed: 00:32:05
$

Here is a quick one that gives hours minutes and seconds since the shell has been opened:

~$ cat how_long_open 
#!/bin/bash

time=$SECONDS
printf '%dh:%dm:%ds\n' $(($time/3600)) $(($time%3600/60)) $(($time%60))

Since scripts run in a subshell, the best way to get output is to source the script instead of calling it.

Examples:

Without sourcing the script

~$ ./how_long_open 
0h:0m:0s

With sourcing the script

~$ source ./how_long_open 
1h:24m:40s

Hope this helps!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Elena Rostova
Author

Elena Rostova

Elena Rostova holds a Master's degree in Public Health Journalism. She covers groundbreaking medical research, holistic wellness trends, mental health awareness, and nutritional science.