Bash extends the for keyword to provide functionality similar to the three-argument for loop used in C:
#!/bin/bash for ((i = 1 ; i <= 10 ; i++)) ; do printf '%u\n' "$i" done
The preceding code prints the numbers from 1 to 10, each terminated by a newline, by assigning each number to the i variable in turn and then printing it. When followed by an unquoted ((, the meaning of for changes; it does not iterate over a list of words, but instead loops using the three semicolon-separated statements in the double parentheses like so:
- The first expression is run before the loop starts: We assign the i value to zero to start it off.
- The second expression is the test used to determine whether the loop should continue or stop: We test whether the value of i is less than 10.
- The third expression runs after each instance of the loop: We add one to the value of i.
If you want to read the help topic for this feature, you will need to quote it: help 'for (('.
You will sometimes read shell scripts that use the non-standard seq tool to do something similar to this:
# Not recommended for i in $(seq 1 10) ; do printf '%u\n' "$i" done
If Bash is available on your system, the for loop is somewhat easier to read, affords greater control, and does not rely on the availability of seq.