'', or ''FALSE'' if any of the arithmetic expressions failed.
===== Alternatives and best practice =====
TODO: Show some alternate usages involving functions and local variables for initialization.
===== Examples =====
==== Simple counter ====
A simple counter, the loop iterates 101 times ("0" to "100" are 101 numbers -> 101 runs!), and everytime the variable ''x'' is set to the current value.
* It **initializes** ''x = 0''
* Before every iteration it **checks** if ''x ≤ 100''
* After every iteration it **changes** ''x++''
for ((x = 0 ; x <= 100 ; x++)); do
echo "Counter: $x"
done
==== Stepping counter ====
This is the very same counter (compare it to the simple counter example above), but the **change** that is made is a ''x += 10''. That means, it will count from 0 to 100, but with a **step of 10**.
for ((x = 0 ; x <= 100 ; x += 10)); do
echo "Counter: $x"
done
==== Bits analyzer ====
This example loops through the bit-values of a Byte, beginning from 128, ending at 1. If that bit is set in the ''testbyte'', it prints "''1''", else "''0''" => it prints the binary representation of the ''testbyte'' value (8 bits).
#!/usr/bin/env bash
# Example written for http://wiki.bash-hackers.org/syntax/ccmd/c_for#bits_analyzer
# Based on TheBonsai's original.
function toBin {
typeset m=$1 n=2 x='x[(n*=2)>m]'
for ((x = x; n /= 2;)); do
printf %d $(( m & n && 1))
done
}
function main {
[[ $1 == +([0-9]) ]] || return
typeset result
if (( $(ksh -c 'printf %..2d $1' _ "$1") == ( result = $(toBin "$1") ) )); then
printf '%s is %s in base 2!\n' "$1" "$result"
else
echo 'Oops, something went wrong with our calculation.' >&2
exit 1
fi
}
main "${1:-123}"
# vim: set fenc=utf-8 ff=unix ft=sh :
testbyte=123
for (( n = 128 ; n >= 1 ; n /= 2 )); do
if (( testbyte & n )); then
printf %d 1
else
printf %s 0
fi
done
echo
Why that one begins at 128 (highest value, on the left) and not 1 (lowest value, on the right)? It's easier to print from left to right...
We arrive at 128 for ''n'' through the recursive arithmetic expression stored in ''x'', which calculates the next-greatest power of 2 after ''m''. To show that it works, we use ksh93 to double-check the answer, because it has a built-in feature for ''printf'' to print a representation of any number in an arbitrary base (up to 64). Very few languages have that ability built-in, even things like Python.
==== Up, down, up, down... ====
This counts up and down from ''0'' to ''${1:-5}'', ''${2:-4}'' times, demonstrating more complicated arithmetic expressions with multiple variables.
for (( incr = 1, n=0, times = ${2:-4}, step = ${1:-5}; (n += incr) % step || (incr *= -1, --times);)); do
printf '%*s\n' "$((n+1))" "$n"
done
~ $ bash <(xclip -o)
1
2
3
4
5
4
3
2
1
0
1
2
3
4
5
4
3
2
1
===== Portability considerations =====
* C-style for loops aren't POSIX. They are available in Bash, ksh93, and zsh. All 3 have essentially the same syntax and behavior.
* C-style for loops aren't available in mksh.
===== Bugs =====
* //Fixed in 4.3//. There appears to be a bug as of Bash 4.2p10 in which command lists can't be distinguished from the for loop's arithmetic argument delimiter (both semicolons), so command substitutions within the C-style for loop expression can't contain more than one command.
===== See also =====
* Internal: [[syntax:arith_expr | Arithmetic expressions]]
* Internal: [[syntax:ccmd:classic_for | The classic for-loop]]
* Internal: [[syntax:ccmd:while_loop | The while-loop]]