Bash比较浮点数

时间:2014-09-24 09:04:30

标签: bash

我有一个数组:

pole_registru=("3" "8" "3.2" "6" "1" "3" "1.3" "3.3" "5.8" "12" "0" "3")

我需要在数组中找到小于1的元素(包括浮点数)并计算它们(较低元素的数量保存到变量 A )。

我试试:

for i in "${pole_registru[@]}"
do
  Hodnota="Value of actual: $i"
  compare=`echo "$i" | bc`
  echo --$compare--
  if [ $i < 1 ]; then (( A+=1 )); else (( A=A )); fi
  echo "$Value ($x) ($A)"
  sleep 1
done

问题进入控制台:

./kontrolaNul.sh: řádek 33: 1: Folder or file does not.

3 个答案:

答案 0 :(得分:2)

直接使用bc来比较数字,例如

pole_registru=("3" "8" "3.2" "6" "1" "3" "1.3" "3.3" "5.8" "12" "0" "3")
for i in "${pole_registru[@]}"
do
  Hodnota="Value of actual: $i"
  if (( $(bc <<< "$i<1") )) ; then (( A+=1 )); else (( A=A )); fi
  echo "$Value ($i) ($A)"
  sleep 1
done

双括号构造用于评估bc的字符串输出作为数值。 (我还在$x行中将$i更改为echo

这给出了:

$ . t.sh 
 (3) (1)
 (8) (1)
 (3.2) (1)
 (6) (1)
 (1) (1)
 (3) (1)
 (1.3) (1)
 (3.3) (1)
 (5.8) (1)
 (12) (1)
 (0) (2)
 (3) (2)

答案 1 :(得分:1)

这可以解决您的问题:

for i in "${pole_registru[@]}"
do
  Hodnota="Value of actual: $i"
  compare=`echo "$i" | bc`
  echo --$compare--
  if [ `echo "$i < 1" | bc` -eq 1 ]; then (( A+=1 )); else (( A=A )); fi
  echo "$Value ($x) ($A)"
  sleep 1
done

答案 2 :(得分:0)

您的立即问题是您在表达式中使用<,这是输入文件重定向运算符 - 它因为没有调用文件而抱怨1从中获取意见。

如果您将其更改为-lt,则会解决该问题。

但是,我不认为bash数字符合浮点数,因此您可能会遇到更多麻烦。

解决这个限制的一种方法是使用做浮点的外部工具,用它从测试编号中减去一个,然后使用bash正则表达式匹配检测负数:

if [[ $(echo $i - 1 | BC_LINE_LENGTH=0 bc) =~ - ]] ; ...

bc程序用于计算给定x - 1的{​​{1}},不用担心x设置,这只是为了BC_LINE_LENGTH设置防止bc内的换行。

然后,如果结果以-字符开头,则结果显然小于零(因为x小于1)。