Looping with a Count

Problem

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 ?

Solution

Use a special case of the for syntax, one that looks a lot like C Language, but with double parentheses:

$ for (( i=0 ; i < 10 ; i++ )) ; do echo $i ; done

Discussion

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:

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 x 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:

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:

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.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.226.165.131