2016-09-20 129 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