2012-03-30 237 views
2

在shell腳本,我們如何能夠比較(整數和浮點),(flaoting和浮點),(浮點和整數),(整數和整數)只有一個如果條件。比較浮點數shell腳本

我有一個像

set X=3.1 
    set Y=4.1 
    if [ $X < $Y ] then 
    echo "wassup" 
    endif 

但是從運行的cron作業犯規上面的幾個例子,似乎工作。

+0

[擊:整數表達預期]的可能的複製(HTTP://計算器。com/questions/17958855/bash-integer-expression-expected) – tripleee 2016-01-20 13:27:18

回答

11

進行浮點運算在bash的方式是使用bc,您可在幾乎所有的Linux發行版。

# bc will return 0 for false and 1 for true 
if [ $(echo "23.3 > 7.3" | bc) -ne 0 ] 
then 
    echo "wassup" 
fi 

有一個good article在linux雜誌上提供關於在bash中使用bc的浮點數學。

+0

我嘗試了下面的代碼,並得到一個錯誤,因爲一元運算期望 – Rajeev 2012-04-01 12:34:44

+0

有趣。我在這裏工作得很好。嗯。你的錯誤意味着(我認爲)'$(echo'$ a> $ b「| bc)'沒有返回一個值。你可以嘗試自己的subshel​​l嗎? – brice 2012-04-01 13:18:36

+0

IE:您的變量沒有正確分配給。例如,'echo $ X'將是一個空行。 – brice 2012-04-01 13:20:45

0

下面的例子適用於bash shell的。

X=3.1 
Y=4.1 
if [ $X -le $Y ] 
then 
    echo "wassup" 
fi 

你可能想學習shell腳本here

+2

這裏不工作,因爲bash不處理浮點:'$ test「34.4」-gt「5.4」 - > bash:test:34.4:預期的整數表達式「 – brice 2012-03-30 08:51:46

+0

這是在solaris 10上測試的代碼和bash shell – 2012-03-30 09:02:13

+4

我不懷疑你的誠意:)我只是說這不能保證在Linux上工作''bash --version'給了我'GNU bash,版本4.2.8(1) - 釋放(x86_64 -pc-linux-gnu)' – brice 2012-03-30 09:04:49

0

編輯。根據該意見,這個答案(感謝用戶未知格倫·傑克曼),似乎使用bc真/假測試時,所需要的bash測試很簡單:

  • (($(echo "$X < $Y" |bc))) ...見下文

wheras測試結果和腳本,需要對舊風格的bash [ ]測試比較-ne 0


bash本身不處理浮點數,但你可以稱這種工具爲bc

man bc- 一個任意精度的計算語言

X=3.1 
Y=4.1 
# This test has two superfluous components. 
# See EDIT (above) and TESTS below 
if (($(echo "scale=9; $X < $Y" |bc)!=0)) ;then 
    echo "wassup" 
fi 

TEST結果:

if [ "1" ] true 
    [ "1" ] true 
if [ "0" ] true 
    [ "0" ] true 

if [ 1 ] true 
    [ 1 ] true 
if [ 0 ] true 
    [ 0 ] true 

if (("1")) true 
    (("1")) true 
if (("0")) false 
    (("0")) false 

if (( 1 )) true 
    (( 1 )) true 
if (( 0 )) false 
    (( 0 )) false 

echo "1<1"|bc true 
echo "1<0"|bc true 

測試腳本:

printf 'if [ "1" ] '; if [ "1" ]; then echo true; else echo false; fi 
printf ' [ "1" ] '; [ "1" ] && echo true || echo false 
printf 'if [ "0" ] '; if [ "0" ]; then echo true; else echo false; fi 
printf ' [ "0" ] '; [ "0" ] && echo true || echo false 
echo 
printf 'if [ 1 ] '; if [ 1 ]; then echo true; else echo false; fi 
printf ' [ 1 ] '; [ 1 ] && echo true || echo false 
printf 'if [ 0 ] '; if [ 0 ]; then echo true; else echo false; fi 
printf ' [ 0 ] '; [ 0 ] && echo true || echo false 
echo 
printf 'if (("1")) '; if (("1")); then echo true; else echo false; fi 
printf ' (("1")) '; (("1")) && echo true || echo false 
printf 'if (("0")) '; if (("0")); then echo true; else echo false; fi 
printf ' (("0")) '; (("0")) && echo true || echo false 
echo 
printf 'if (( 1 )) '; if ((1)); then echo true; else echo false; fi 
printf ' (( 1 )) '; ((1)) && echo true || echo false 
printf 'if (( 0 )) '; if ((0)); then echo true; else echo false; fi 
printf ' (( 0 )) '; ((0)) && echo true || echo false 
echo 
printf 'echo "1<1"|bc '; echo "1<1"|bc >/dev/null && echo true || echo false 
printf 'echo "1<0"|bc '; echo "1<0"|bc >/dev/null && echo true || echo false 
+1

'scale'是多餘的,如果你只是想測試true和false。 '!= 0'也是多餘的 - 這就是已經完成的事情。 – 2012-03-30 09:09:22

+0

@用戶未知:謝謝.. – 2012-03-30 09:48:07

+1

'!= 0'是* not *多餘的:bc *打印* 0或1表示錯誤或真實。在這兩種情況下,*退出狀態*都爲零。所以,你必須將命令輸出與某些東西進行比較。 – 2012-03-30 10:26:31

1

呸本身只處理整數。使用bc:

echo "$X>$Y" | bc 
0 
echo "$X<$Y" | bc 
1 

您不需要擔心比例。它僅僅是爲輸出格式的preocision:

X=3.000001 
Y=3.0001 
echo "$X>$Y" | bc 
0 
echo "$X<$Y" | bc 
1 
echo "scale=1;$X<$Y" | bc 
1