Trying to subtract two times down to the nanosecond in shell.
declare start
function handler() {
count=$1
if [ "$1" -le 0 ]; then
echo "Not a valid entry"
exit
fi
read -p "Enter in R or N: " VAR1
VAR2="R"
VAR3="r"
VAR4="N"
VAR5="n"
date "%A %B %d, %Y %T.%N"
start=$(date "%T.%N")
if [ "$VAR1" = "$VAR2" ]; then
recFib "$1" "$start"
elif [ "$VAR1" = "$VAR3" ]; then
recFib "$1" "$start"
elif [ "$VAR1" = "$VAR4" ]; then
itFib "$1" "$start"
elif [ "$VAR1" = "$VAR5" ]; then
itFib "$1" "$start"
else
echo "Not a valid input"
fi
}
function recFib() {
if [ $1 -le 0 ]; then
echo 0
elif [ $1 -eq 1 ]; then
echo 1
else
stop=$(date "%T.%N")
echo $((date $stop-$start))
echo $(($(recFib $(($1 - 2))) $(recFib $(($1 - 1)))))
fi
}
I have tried this a number of different ways however I am not sure how to perform the subtraction on the two times. Since it is recursive I am trying to grab the time after each generation.
CodePudding user response:
Use
start=$(date %s.%N)
stop=$(date %s.%N)
Using only %s
and %N
is timezone independent (like -u
). So hazards on summer time switch are suppressed.
To get the difference, use:
duration=$( bc <<<"$stop-$start" )
CodePudding user response:
Why not move
stop=$(date "%T.%N")
echo $((date $stop-$start))
to the end of function handler()
body.
CodePudding user response:
You must use something that supports floating point math. You can use bc
or you can use awk
. For example, let's say you have a start and end time of:
01:39:47.109964128
01:43:07.280513101
To get the time difference, you can simply pipe the two times to awk
on separate lines. Below with the start time first and stop time second, e.g.:
$ echo -e "01:39:47.109964128\n01:43:07.280513101" |
awk -F: '
FNR==1 {h1=$1; m1=$2; s1=$3; next}
{h2=$1; m2=$2; s2=$3; exit}
END {
if (s2 < s1) {s2 = 60; m2 -= 1}
printf "d:d:2.9f\n", h2-h1, m2-m1, s2-s1 }
'
00:03:20.170548973
Where h1
, m1
, s1
are hour-start, minute-start, seconds-start, etc....
For a solution with date, you have to convert both start time and stop time to seconds since epoch, e.g. ' %s.%N'
and then pipe the subtraction of seconds.nanoseconds to bc
and then you need to convert back to H:M:S.N
format.