Reputation: 23858
How can I write a decimal for loop in bash
I get an error like
((: upgradver=1.00: syntax error: invalid arithmetic operator (error token is ".00")
I am trying something like
upgradever=1.00
newver=1.06
for (($ver=$upgradever; $ver<$newver; $ver+=0.01))
do
echo "Upgrade to $ver"
done
Upvotes: 3
Views: 1644
Reputation: 9
Bash doesn't support floating point numbers, but there is a program BC (Best Calculator) that supports decimal arithmetic.
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
Upvotes: 1
Reputation: 113834
Two approaches:
bc
The shell does not do floats but the standard utility bc
does. This will do your loop:
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
Sample output:
$ 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
Output:
$ 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
Upvotes: 6
Reputation: 13914
In short, you "can't," in the sense that the Bourne shell doesn't "do" floating-point math.
You can, however, use another scriptable tool, like Perl, to do it for you:
$ver = $(perl -e "print $ver + .01")
see also bc
, awk
, or other tools.
Upvotes: 2