shell浮點數運算問題 - Linux

By Hedda
at 2018-12-04T23:26
at 2018-12-04T23:26
Table of Contents
忍不住回一下...
※ 引述《zchien (小建)》之銘言:
: 我用unix 系統
UNIX的商標權由國際開放標準組織所擁有
只有符合單一UNIX規範的UNIX系統才能使用UNIX這個名稱
否則只能稱為類UNIX(UNIX-like)。
既然你來到這個版, 我猜你是用 Linux, 就直接說用 Linux 吧
: 寫sh時,遇到了一個bug ,就是浮點數無法運算
我猜你的意思是 寫 shell script.
: 我使用ntpdate去校正時間, 並且記錄校正了多少時間
: 例如:需要校正的時間是 0.000304 s
: 我寫
: ntpdate -p 10.37.82.23 > time.txt
不知道你是用哪一個系統?
Linux 用 ntpdate -p 10.37.82.23 應該會報錯吧?!
usage: ntpdate [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] \
[-o version#] [-t timeo] server ...
或是你是指 ntpdate -q 10.37.82.23 ?
: NTP= grep delay time.txt | awk ' ' {print $6}
上面的語法應該也會報錯吧?
NTP=$(grep delay time.txt | awk '{print $6}')
: # $NTP will show 類似 0.000304
: if [ $NTP -le 0.100001 ];then
: ntpdate -u 10.37.82.23
: fi
先不管 能不能用小數點的問題.
為什麼 小於等於 0.100001 秒才更新?
如果 offset 大於 0.100001 秒就不更新?
: # 如果NTP server 連線異常, $NTP will show 0.000000
: if [ $NTP -eq 0.000000 ];then
: echo "NTP server not connect"
: fi
: 上面第一個if 會 不成立 , 可能類似浮點數運算, 他以為兩個都是0
: 第二個if 也會顯示錯誤, [0.000000 -eq 0.000000 ] 他竟然顯示不相等
: 請問這是什麼原因,我可以怎麼修正
應該不會是不成立或是不相等吧?
-eq 應該會直接罵人, 類似:
./test.sh: line n: [: 0.000000: integer expression expected
首先, 既然你是用 > time.txt, 會一直被覆蓋, 所以假設 time.txt 並沒有要保留.
那其實可以直接一路 | 到底
NTP=$(ntpdate -q 10.37.82.23 | grep delay | awk '{print $6}')
然後都已經用 awk 了, 可以不用特別再叫 grep 出來跑龍套
NTP=$(ntpdate -q 10.37.82.23 | awk '/delay/{print $6}')
另外, 不知道你有沒有發現, 這樣你得到的 NTP 後面其實會有一個 ,
$ ntpdate -q clock.stdtime.gov.tw
server 211.22.103.158, stratum 2, offset 0.000697, delay 0.03252
4 Dec 22:41:21 ntpdate[1947]: adjust time server 211.22.103.158 offset 0.000697 sec
這應該會影響你後面的判斷式
把它去掉比較好一些
NTP=$(ntpdate -q 10.37.82.23 | awk '/delay/{print $6}'|sed -e 's/,$//')
或是可以在 awk print 時先乘 1000000, 然後往後都可以用 us(微秒) 來處理
這樣 awk 會自己把 , 去掉, 也間接避開了小數點運算的限制
NTP=$(ntpdate -q 10.37.82.23 | awk '/delay/{print $6*1000000}')
if [ "$NTP" -le "100001" ];then
ntpdate -u 10.37.82.23
fi
if [ "$NTP" -eq "0" ];then
echo "NTP server not connect"
fi
先不管不能判斷小數點, 邏輯判斷上 0.000000 也是 -le 0.100001 呀...
把兩個 if 合在一起吧.
NTP=$(ntpdate -q 10.37.82.23 | awk '/delay/{print $6*1000000}')
if [ "$NTP" -eq "0" ];then
echo "NTP server not connect"
elif [ "$NTP" -le "100001" ];then
ntpdate -u 10.37.82.23
fi
雖然機率不比中樂透高, 有考慮過如果剛剛好 offset 是 0.000000 秒嗎?
man ntpdate:
DIAGNOSTICS
ntpdate’s exit status is zero if it finds a server and updates the
clock, and nonzero otherwise.
ntpdate 有錯誤時的 return code 不是 0, 建議用這個來判斷比較好.
#!/bin/sh
ntp_response=$(ntpdate -q 10.37.82.23 2>&1)
rc=$?
if [ "${rc}" -ne "0" ];then
echo "ntpdate error, return code: ${rc}"
else
ntp_offset=$(echo ${ntp_response} | awk '/delay/{print $6*1000000}')
if [ "${ntp_offset}" -le "100001" ];then
echo "offset: ${ntp_offset}"
ntpdate -u 10.37.82.23
fi
fi
大概是醬~
最後有兩個問題還是不解.
1. 為什麼 offset -le 0.100001 才要 -u, 超過 0.100001 不處理嗎?
2. 有考慮直接改用 ntpd 嗎?
--
※ 引述《zchien (小建)》之銘言:
: 我用unix 系統
UNIX的商標權由國際開放標準組織所擁有
只有符合單一UNIX規範的UNIX系統才能使用UNIX這個名稱
否則只能稱為類UNIX(UNIX-like)。
既然你來到這個版, 我猜你是用 Linux, 就直接說用 Linux 吧
: 寫sh時,遇到了一個bug ,就是浮點數無法運算
我猜你的意思是 寫 shell script.
: 我使用ntpdate去校正時間, 並且記錄校正了多少時間
: 例如:需要校正的時間是 0.000304 s
: 我寫
: ntpdate -p 10.37.82.23 > time.txt
不知道你是用哪一個系統?
Linux 用 ntpdate -p 10.37.82.23 應該會報錯吧?!
usage: ntpdate [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] \
[-o version#] [-t timeo] server ...
或是你是指 ntpdate -q 10.37.82.23 ?
: NTP= grep delay time.txt | awk ' ' {print $6}
上面的語法應該也會報錯吧?
NTP=$(grep delay time.txt | awk '{print $6}')
: # $NTP will show 類似 0.000304
: if [ $NTP -le 0.100001 ];then
: ntpdate -u 10.37.82.23
: fi
先不管 能不能用小數點的問題.
為什麼 小於等於 0.100001 秒才更新?
如果 offset 大於 0.100001 秒就不更新?
: # 如果NTP server 連線異常, $NTP will show 0.000000
: if [ $NTP -eq 0.000000 ];then
: echo "NTP server not connect"
: fi
: 上面第一個if 會 不成立 , 可能類似浮點數運算, 他以為兩個都是0
: 第二個if 也會顯示錯誤, [0.000000 -eq 0.000000 ] 他竟然顯示不相等
: 請問這是什麼原因,我可以怎麼修正
應該不會是不成立或是不相等吧?
-eq 應該會直接罵人, 類似:
./test.sh: line n: [: 0.000000: integer expression expected
首先, 既然你是用 > time.txt, 會一直被覆蓋, 所以假設 time.txt 並沒有要保留.
那其實可以直接一路 | 到底
NTP=$(ntpdate -q 10.37.82.23 | grep delay | awk '{print $6}')
然後都已經用 awk 了, 可以不用特別再叫 grep 出來跑龍套
NTP=$(ntpdate -q 10.37.82.23 | awk '/delay/{print $6}')
另外, 不知道你有沒有發現, 這樣你得到的 NTP 後面其實會有一個 ,
$ ntpdate -q clock.stdtime.gov.tw
server 211.22.103.158, stratum 2, offset 0.000697, delay 0.03252
4 Dec 22:41:21 ntpdate[1947]: adjust time server 211.22.103.158 offset 0.000697 sec
這應該會影響你後面的判斷式
把它去掉比較好一些
NTP=$(ntpdate -q 10.37.82.23 | awk '/delay/{print $6}'|sed -e 's/,$//')
或是可以在 awk print 時先乘 1000000, 然後往後都可以用 us(微秒) 來處理
這樣 awk 會自己把 , 去掉, 也間接避開了小數點運算的限制
NTP=$(ntpdate -q 10.37.82.23 | awk '/delay/{print $6*1000000}')
if [ "$NTP" -le "100001" ];then
ntpdate -u 10.37.82.23
fi
if [ "$NTP" -eq "0" ];then
echo "NTP server not connect"
fi
先不管不能判斷小數點, 邏輯判斷上 0.000000 也是 -le 0.100001 呀...
把兩個 if 合在一起吧.
NTP=$(ntpdate -q 10.37.82.23 | awk '/delay/{print $6*1000000}')
if [ "$NTP" -eq "0" ];then
echo "NTP server not connect"
elif [ "$NTP" -le "100001" ];then
ntpdate -u 10.37.82.23
fi
雖然機率不比中樂透高, 有考慮過如果剛剛好 offset 是 0.000000 秒嗎?
man ntpdate:
DIAGNOSTICS
ntpdate’s exit status is zero if it finds a server and updates the
clock, and nonzero otherwise.
ntpdate 有錯誤時的 return code 不是 0, 建議用這個來判斷比較好.
#!/bin/sh
ntp_response=$(ntpdate -q 10.37.82.23 2>&1)
rc=$?
if [ "${rc}" -ne "0" ];then
echo "ntpdate error, return code: ${rc}"
else
ntp_offset=$(echo ${ntp_response} | awk '/delay/{print $6*1000000}')
if [ "${ntp_offset}" -le "100001" ];then
echo "offset: ${ntp_offset}"
ntpdate -u 10.37.82.23
fi
fi
大概是醬~
最後有兩個問題還是不解.
1. 為什麼 offset -le 0.100001 才要 -u, 超過 0.100001 不處理嗎?
2. 有考慮直接改用 ntpd 嗎?
--
Tags:
Linux
All Comments

By Ethan
at 2018-12-06T07:30
at 2018-12-06T07:30

By Todd Johnson
at 2018-12-06T21:58
at 2018-12-06T21:58

By Edward Lewis
at 2018-12-09T05:43
at 2018-12-09T05:43

By Emma
at 2018-12-13T17:41
at 2018-12-13T17:41

By Hazel
at 2018-12-13T23:27
at 2018-12-13T23:27

By Aaliyah
at 2018-12-17T08:42
at 2018-12-17T08:42

By Valerie
at 2018-12-18T19:04
at 2018-12-18T19:04

By Suhail Hany
at 2018-12-21T01:36
at 2018-12-21T01:36
Related Posts
shell浮點數運算問題

By Margaret
at 2018-12-03T22:44
at 2018-12-03T22:44
請益家目錄設定檔備份與維護方式

By Jacky
at 2018-12-03T00:33
at 2018-12-03T00:33
fil 一個執行檔分析工具

By Lucy
at 2018-12-02T19:34
at 2018-12-02T19:34
常常系統變成唯讀狀態,必須要執行fsck才正常

By Damian
at 2018-11-28T23:11
at 2018-11-28T23:11
ubuntu 18.10 vsftpd 架設

By Anthony
at 2018-11-28T10:14
at 2018-11-28T10:14