如何在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
如何在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
两种方法:
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
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
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简而言之,就是在Bourne shell中无法进行浮点数运算。
不过,你可以使用另一个可编写脚本的工具,比如Perl,来代替进行浮点数运算:
$ver = $(perl -e "print $ver + .01")
bc
、awk
或其他工具。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
bc
意思是 基本计算器 而不是 _最佳计算器_。 - gniourf_gniourf