Bashを使用して24時間を含む変数を減算することは可能ですか?
#!/bin/bash
var1="23:30" # 11:30pm
var2="20:00" # 08:00pm
echo "$(expr $var1 - $var2)"
実行すると、次のエラーが発生します。
./test
expr: non-integer argument
出力を10進形式で表示する必要があります。たとえば、次のようになります。
./test
3.5
答え1
このdate
コマンドの入力は非常に柔軟です。以下の利点を活用できます。
#!/bin/bash
var1="23:30"
var2="20:00"
# Convert to epoch time and calculate difference.
difference=$(( $(date -d "$var1" "+%s") - $(date -d "$var2" "+%s") ))
# Divide the difference by 3600 to calculate hours.
echo "scale=2 ; $difference/3600" | bc
出力:
$ ./test.bash
3.50
答え2
bash
外部プログラムなしでを使用して、次のことができます。
#!/bin/bash
# first time is the first argument, or 23:30
var1=${1:-23:30}
# second time is the second argument, or 20:00
var2=${2:-20:00}
# Split variables on `:` and insert pieces into arrays
IFS=':' read -r -a t1 <<< "$var1"
IFS=':' read -r -a t2 <<< "$var2"
# strip leading zeros (so it's not interpreted as octal
t1=("${t1[@]##0}")
t2=("${t2[@]##0}")
# check if the first time is before the second one
if (( t1[0] > t2[0] || ( t1[0] == t2[0] && t1[1] > t2[1]) ))
then
# if the minutes on the first time are less than the ones on the second time
if (( t1[1] < t2[1] ))
then
# add 60 minutes to time 1
(( t1[1] += 60 ))
# and subtract an hour
(( t1[0] -- ))
fi
# now subtract the hours and the minutes
echo $((t1[0] -t2[0] )):$((t1[1] - t2[1]))
# to get a decimal result, multiply the minutes by 100 and divide by 60
echo $((t1[0] -t2[0] )).$(((t1[1] - t2[1])*100/60))
else
echo "Time 1 should be after time 2" 2>&1
fi
テスト:
$ ./script.sh
3:30
3.50
$ ./script.sh 12:10 11:30
0:40
0.66
$ ./script.sh 12:00 11:30
0:30
0.50
日付に基づいてより複雑な視差が必要な場合は、GNU Dateを使用する方が良いでしょう。
答え3
Awkを使用すると、区切り文字をスペースまたはコロンに設定して目的の計算を実行できます。
#!/bin/bash
var1="23:30"
var2="20:00"
echo "$var1" "$var2" | awk -F":| " '{print (60*($1-$3)+($2-$4))/60 }'
答え4
手動で計算するのは簡単です。
$ printf '%02d:%02d\n' "$(((d=(${var1/:/*60+})-(${var2/:/*60+})),d/60))" "$((d%60))"
03:30
これは、そう$var1
で$var2
なければ同様の結果が得られると仮定します-02:-21
。
または zsh/ksh93/yash の浮動小数点の場合:
$ echo "$((((${var1/:/*60+})-${var2/:/*60+})/60.))"
3.5
使用する必要がある場合bash
(浮動小数点演算はサポートされていません):
$ awk 'BEGIN{print ARGV[1]/60}' "$(((${var1/:/*60+})-${var2/:/*60+}))"
3.5
浮動小数点部分を手動で計算することもできます。全体の計算を実行awk
。