在我的bash腳本中,我嘗試使用浮點比較語法錯誤:bash腳本中的算術運算符無效
a=0.32
b=0.38
我已經寫了下面的代碼片段,
if [[ $(`bc-l <<< "$b > $a"`) -eq 0 ]]; then
echo "true"
else
echo "false"
fi
請指點。
在我的bash腳本中,我嘗試使用浮點比較語法錯誤:bash腳本中的算術運算符無效
a=0.32
b=0.38
我已經寫了下面的代碼片段,
if [[ $(`bc-l <<< "$b > $a"`) -eq 0 ]]; then
echo "true"
else
echo "false"
fi
請指點。
確保你實際上是在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
'[[「$ a」>「$ c」]]'與bc -l <<<"$a > $ c「'不完全相同。 '9'到'10':前者會說'9'是較大的數字,因爲它正在進行** ASCII **比較,而不是**數字**比較。觀察'a = 9; b = 10; [[$ a> $ b]] &&回聲「$ a大於$ b」' –
(......):您不需要'[[]]'中的引號,當需要將這些右側分別視爲文字字符串而不是全局樣式模式或ERE語法正則表達式時,除''='或'=〜'運算符的右側外,可以隱式地分割和擴展全局擴展。 –
@CharlesDuffy,數字上下文如何:'a = 9; B = 10; (($ a> $ b))&& echo「$ a大於$ b」'?那會好嗎? – blackpen
簡單地增加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
選擇一個:'$(...)'或反引號。他們做同樣的事情,不應該嵌套。 – chepner
@chepner:我同意他們*不應該*,但我不認爲嵌套他們會導致任何問題。 –
如果反引號的命令本身不生成有效的命令, – chepner