試圖在 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
}
我已經嘗試了多種不同的方法,但是我不確定如何兩次執行減法。由于它是遞回的,我試圖在每一代之后抓住時間。
uj5u.com熱心網友回復:
采用
start=$(date %s.%N)
stop=$(date %s.%N)
僅使用%sand 與%N時區無關(如-u)。所以夏時開關的危害被抑制了。
要獲得差異,請使用:
duration=$( bc <<<"$stop-$start" )
uj5u.com熱心網友回復:
為什么不動
stop=$(date "%T.%N")
echo $((date $stop-$start))
到function handler()身體的盡頭。
uj5u.com熱心網友回復:
您必須使用支持浮點數學的東西。您可以使用bc,也可以使用awk. 例如,假設您的開始和結束時間為:
01:39:47.109964128
01:43:07.280513101
要獲得時差,您可以簡單地將兩次管道傳輸awk到不同的行。下面首先是開始時間,然后是停止時間,例如:
$ 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
其中h1, m1,s1是小時開始、分鐘開始、秒開始等....
對于具有日期的解決方案,您必須將開始時間和停止時間都轉換為自紀元以來的秒數,例如' %s.%N',然后將 seconds.nanoseconds 的減法通過管道傳輸到bc,然后您需要轉換回H:M:S.N格式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/473079.html
下一篇:在linux中捕獲錯誤資訊失敗
