You need to loop a fixed number of times. You could use a while loop and do the counting and testing, but programming languages have for loops for such a common idiom.
How does one do this in bash ?
Use a special case of the for syntax, one that looks a lot like C Language, but with double parentheses:
1 |
$ for (( i=0 ; i < 10 ; i++ )) ; do echo $i ; done |
In early versions of the shell, the original syntax for the for loop only included iterating over a fixed list of items.
It was a neat innovation for such a word-oriented language as shell scripts, dealing with filenames and such.
But when users needed to count, they sometimes found themselves writing:
1 2 3 4 |
for i in 1 2 3 4 5 6 7 8 9 10 do echo $i done |
Now that’s not too bad, especially for small loops, but let’s face it—that’s not going to work for 500 iterations.
(Yes, you could nest loops 5 × 10, but come on!) What you really need is a for loop that can count.
The special case of the for loop with C-like syntax is a relatively recent addition to bash (appearing in version 2.04).
Its more general form can be described as:
1 |
for (( expr1 ; expr2 ; expr3 )) ; do list ; done |
The use of double parentheses is meant to indicate that these are arithmetic expressions.
You don’t need to use the $ construct (as in $i, except for arguments like $1) when referring to variables inside the double parentheses (just like the other places where double parentheses are used in bash).
The expressions are integer arithmetic expressions and offer a rich variety of operators, including the use of the comma to put multiple operations within one expression:
1 2 3 4 |
for (( i=0, j=0 ; i+j < 10 ; i++, j++ )) do echo $((i*j)) done |
That for loop initializes two variables (i and j), then has a more complex second expression adding the two together before doing the less-than comparison.
The comma operator is used again in the third expression to increment both variables.