在我的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