我有一个循环,当GPS坐标在小数点后第三位发生变化时,通过比较以前的坐标和当前的坐标,每10分钟更新一次。
然而,我只希望更新发生在小数点变化超过+- 0.002的时候。意思是,如果$latA = 64.019或$lonA = -152.617,而$latB = 64.017、64.018、64.020或64.021;或$lonB = -152.615、-152.616、-152.618或-152.619;那么我希望if语句改为true。
while :
do
LAT=$(cat /tmp/getGPS | awk 'BEGIN{RS=","; FS=":"} /lat/ {save=$2} END {print save}')
LON=$(cat /tmp/getGPS | awk 'BEGIN{RS=","; FS=":"} /lon/ {save=$2} END {print save}')
ALT=$(cat /tmp/getGPS | awk 'BEGIN{RS=","; FS=":"} /alt/ {save=$2} END {print save}')
ALT=$(echo "scale=0; $ALT * 3.281/1" | bc)
latB=$(echo "scale=3; $LAT /1" | bc)
lonB=$(echo "scale=3; $LON /1" | bc)
if [ "$latA" = "$latB" ] || [ "$lonA" = "$lonB" ]
then
echo "latA = latB"
sleep 600
else
echo "latA != latB"
latA=$latB
lonA=$lonB
fi
done
输出结果是这样的。
$ ./getGPS
0 - 64.019123167 -152.617497833 114ft
A -
B - 64.019 -152.617
latA != latB
0 - 64.019124167 -152.617497667 115ft
A - 64.019 -152.617
B - 64.019 -152.617
latA = latB
Sleeping...
谢谢你的帮助
谢谢你的帮助。
您可以继续使用 bc
来计算。
$ epsilon="0.002"
$ echo "define abs(i) {if (i < 0) return (-i); return (i)}; abs(64.019 - 64.018) <= $epsilon" | bc
1
$ echo "define abs(i) {if (i < 0) return (-i); return (i)}; abs(64.019 - 64.016) <= $epsilon" | bc
0
这个bc脚本返回0(false),如果差值大于: epsilon
,否则为1(true)。
你可以这样使用。
latNearlyEqual=$(echo "define abs(i) {if (i < 0) return (-i); return (i)}; abs($latA - $latB) <= $epsilon" | bc)
if [ $latNearlyEqual -eq 1 ]
then
...
fi