我有一个数组:
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.
答案 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)。