2010-03-11 107 views
16

您能否給我建議在Bash腳本中進行浮點比較的語法?我希望將它用作if聲明的一部分。這裏是一個小的代碼片段:Shell腳本中的浮點比較

key1="12.3" 
result="12.2" 

if (($result <= $key1)) 
then 
    # some code here 
fi 
+1

聽起來像是時候用不同的shell腳本語言編寫腳本了。你可能會喜歡Python。 – 2010-03-11 12:22:19

+1

@Roger:別小看慶典,它比人們想象的是經常有很多更強大的..除了,你知道,處理花車.. :) – falstro 2010-03-11 12:23:30

+0

@Roger不是真的... – ghostdog74 2010-03-11 12:23:49

回答

14

的bash沒有做花車,用awk

key1=12.3 
result=12.5 
var=$(awk 'BEGIN{ print "'$key1'"<"'$result'" }')  
# or var=$(awk -v key=$key1 -v result=$result 'BEGIN{print result<key?1:0}') 
# or var=$(awk 'BEGIN{print "'$result'"<"'$key1'"?1:0}') 
# or 
if [ "$var" -eq 1 ];then 
    echo "do something" 
else 
    echo "result more than key" 
fi 

還有其他的殼可以做花車,喜歡的zsh或ksh,你可能想使用嘗試他們以及

+1

+1或perl,或... – falstro 2010-03-11 12:22:23

+0

感謝GhostDog74,你的意見確實有幫助.. 你一直很好的支持.. 謝謝大家 – Kiran 2010-03-11 12:28:29

+3

這看起來像一個相當尷尬的方式來做到這一點(沒有雙關語意)。 – Sorpigal 2010-03-11 12:37:56

51

bc是你的朋友:

key1="12.3" 
result="12.2" 
if [ $(bc <<< "$result <= $key1") -eq 1 ] 
    then 
    # some code here 
fi 

注意有些OBS治療這裏字符串<<<)符號,作爲echo "$result <= $key1" | bc的不錯選擇。

此外,未bash類似的bc打印1真正0

+0

發誓..這是好的.. – Kiran 2010-03-11 12:32:15

+1

bc(或者甚至dc)對此很有幫助,比awk方法更容易閱讀,但這樣做需要一個子shell(或一個管道)。在效率方面,expr更好,我也覺得它更易於閱讀。但是,BC的+1! – Sorpigal 2010-03-11 12:35:18

+0

如果你的意思是「比awk更容易閱讀」的意思是它更短,那是因爲我將shell變量與awk變量分開。我也可以這樣寫'var = $(awk'BEGIN {print''$ result'「<」'$ key1'「?1:0}') ' – ghostdog74 2010-03-11 12:42:17

4

使用的awkexit()功能使得它幾乎可讀。

key1=12.3 
result=12.5 

# the ! awk is because the logic in boolean tests 
# is the opposite of the one in shell exit code tests 
if ! awk "{ exit ($result <= $key1) }" < /dev/null 
then 
     # some code here 
fi 

請注意,有沒有需要重用[操作員if已經使用了退出值。

6

與BC另一個簡單明確的方法是這樣的:

if ((`bc <<< "10.21>12.22"`)); then echo "true"; else echo "false"; fi 
0
### The funny thing about bash is this: 
> AA=10.3 
> BB=10.4 
> [[ AA > BB ]] && echo Hello 
> [[ AA < BB ]] && echo Hello 
Hello 

是的,我知道這是欺騙,但它的工作原理。科學記數法在這裏不起作用。

0

宇可以使用內部的此AWK比較if語句,將打印1(真),如果該條件爲真否則爲0(假),並且這些值將被如果

if (($(awk 'BEGIN {print ("'$result'" <= "'$key1'")}'))); then 
    echo "true" 
else 
    echo "false" 
fi 
被解釋爲布爾瓦爾斯