M BUZZ CRAZE NEWS
// news

How do I use $SECONDS inside a bash script?

By John Parsons

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

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

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