如何在Bash中编写十进制for循环

3

如何在bash中编写十进制for循环

我收到一个错误信息,类似于

((: upgradver=1.00: syntax error: invalid arithmetic operator (error token is ".00")

我正在尝试类似的东西。
upgradever=1.00
newver=1.06
for (($ver=$upgradever; $ver<$newver; $ver+=0.01))
do
    echo "Upgrade to $ver"
done

1
Bash 无法执行浮点数运算。 - Cheery
3个回答

6

两种方法:

使用bc

Shell不能处理浮点数,但标准工具bc可以。以下代码可以实现你的循环:

upgradever=1.00
newver=1.06

ver=$upgradever
while [ 1 = "$(echo "$ver < $newver" | bc -l)" ]
do
    echo "Upgrade to $ver"
    ver=$(echo "$ver + 0.01" | bc -l)
done

示例输出:

$ bash script.sh
Upgrade to 1.00
Upgrade to 1.01
Upgrade to 1.02
Upgrade to 1.03
Upgrade to 1.04
Upgrade to 1.05

通过转换为百分数的纯Bash解决方案

upgradever=100
newver=106
for ((ver=$upgradever; $ver<$newver; ver+=1))
do
    printf -v version '%s.%02i' "$((ver/100))" "$((ver%100))"
    echo "Upgrade to $version"
done

输出:

$ bash  sscript.sh
Upgrade to 1.00
Upgrade to 1.01
Upgrade to 1.02
Upgrade to 1.03
Upgrade to 1.04
Upgrade to 1.05

优秀的解决方案。仅供参考。如果您可以使用纯Bash方法,它比bc更高效(在105次迭代中为100-206 -- real 0m0.026s; user 0m0.018s; sys 0m0.006s),而bc为(1.00-2.06 -- real 0m1.134s; user 0m0.226s; sys 0m0.572s)。 - David C. Rankin

2

简而言之,就是在Bourne shell中无法进行浮点数运算。

不过,你可以使用另一个可编写脚本的工具,比如Perl,来代替进行浮点数运算:

 $ver = $(perl -e "print $ver + .01")

参见 bcawk或其他工具。

谢谢@BRPocock - 我也想接受你的答案 - 但我只能选择一个,而你比John1024慢了几毫秒 - 不过我会给你+1。 - Adrian Cornish
1
没问题,他们的回答更加完整 :-) 很值得肯定。 - BRPocock

1

Bash不支持浮点数,但是有一个程序BC(Best Calculator)支持十进制算术。

upgradever="1.00"
newver="1.06"

for (( i=$(bc<<<"($upgradever*100)/1"); $i<$(bc<<<"$newver/0.01"); i++ )); do
      echo $(bc<<<"0.01 * $i")
done

1
你迟到了1个小时 :) - midori
我认为 bc 意思是 基本计算器 而不是 _最佳计算器_。 - gniourf_gniourf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接