2016-09-20 143 views
-2

在我的bash腳本中,我嘗試使用浮點比較語法錯誤:bash腳本中的算術運算符無效

a=0.32 
b=0.38 

我已經寫了下面的代碼片段,

if [[ $(`bc-l <<< "$b > $a"`) -eq 0 ]]; then 
echo "true" 
else 
echo "false" 
fi 

請指點。

+1

選擇一個:'$(...)'或反引號。他們做同樣的事情,不應該嵌套。 – chepner

+0

@chepner:我同意他們*不應該*,但我不認爲嵌套他們會導致任何問題。 –

+2

如果反引號的命令本身不生成有效的命令, – chepner

回答

1

確保你實際上是在bash shell中運行。

#!/bin/bash 
a=0.32; b=0.18; c=0.60  
if [[ $(bc -l <<< "$a > $b") -eq 1 ]]; then 
    echo "$a > $b" 
else 
    echo "$a <= $b" 
fi 

if [[ $(bc -l <<< "$a > $c") -eq 1 ]]; then 
    echo "$a > $c" 
else 
    echo "$a <= $c" 
fi 
+1

'[[「$ a」>「$ c」]]'與bc -l <<<"$a > $ c「'不完全相同。 '9'到'10':前者會說'9'是較大的數字,因爲它正在進行** ASCII **比較,而不是**數字**比較。觀察'a = 9; b = 10; [[$ a> $ b]] &&回聲「$ a大於$ b」' –

+0

(......):您不需要'[[]]'中的引號,當需要將這些右側分別視爲文字字符串而不是全局樣式模式或ERE語法正則表達式時,除''='或'=〜'運算符的右側外,可以隱式地分割和擴展全局擴展。 –

+0

@CharlesDuffy,數字上下文如何:'a = 9; B = 10; (($ a> $ b))&& echo「$ a大於$ b」'?那會好嗎? – blackpen

0

您的腳本中有語法錯誤。

  • $()或back ticks用於命令替換,而不是兩者。

可以糾正它,

if [[ $(bc -l <<< "$b > $a") -eq 0 ]]; then 
    echo "true" 
else 
    echo "false" 
fi 
+0

在控制檯上試過,但對a> b&b> a顯示爲true a – Rock

+0

也許OP試圖使用'<<<',這比'echo | '在bash中。 –

+0

不清楚這個 – Rock

1

簡單地增加set -x你的腳本來顯示它在做什麼會有所幫助:

#!/bin/bash 

set -x 

a=0.32 
b=0.38 

if [[ $(`bc-l <<< "$b > $a"`) -eq 0 ]]; then 
echo "true" 
else 
echo "false" 
fi 

輸出:

+ a=0.32 
+ b=0.38 
+++ bc-l 
./39599898.sh: line 8: bc-l: command not found 
+ [[ '' -eq 0 ]] 
+ echo true 
true 

你可能是指bc -l,不bc-l

+ a=0.32 
+ b=0.38 
+++ bc -l 
++ 1 
./39599898.sh: line 8: 1: command not found 
+ [[ '' -eq 0 ]] 
+ echo true 
true 

這更像它。現在,它看起來像你只是想比較1這就是bc輸出,不運行它作爲一個命令:

if [[ $(bc -l <<< "$b > $a") -eq 0 ]]; then 
echo "true" 
else 
echo "false" 
fi 
+ a=0.32 
+ b=0.38 
++ bc -l 
+ [[ 1 -eq 0 ]] 
+ echo false 
false 

可以進一步簡化,因爲你所尋求的輸出布爾所以比較反對0只是:

if ! let $(bc -l <<< "$b > $a"); then 
echo "true" 
else 
echo "false" 
fi