In programming, the two most common types of loop are “for” and “while” loops. We can do both (and “repeat” loops, too, because that’s just a special case of the “while” loop) with the *nix shell. I’ve got some more detail in the tutorial.
for loops
Some languages have a “foreach” command; if you are used to such a language, then treat the shell’s for
command as equivalent to foreach
. If not, then don’t worry about it, just watch the examples, it’s about as simple as it can be.
$ for artist in Queen "Elvis Costello" Metallica > do > echo "I like $artist" > done I like Queen I like Elvis Costello I like Metallica $
The for
loop will simply go through whatever text it gets passed, and do the same stuff with each item.
Note that for “Elvis Costello” to be marked as one artist, not “Elvis” and “Costello”, I had to put quotes around the words. However, if these were files, then the following would suffice:
$ ls -l total 0 -rw-r--r-- 1 steve steve 0 2007-03-07 00:45 Elvis Costello -rw-r--r-- 1 steve steve 0 2007-03-07 00:45 Metallica -rw-r--r-- 1 steve steve 0 2007-03-07 00:45 Queen $ for artist in * > do > echo "I like $artist" > done I like Elvis Costello I like Metallica I like Queen $
This time around, because we passed them via the shell’s interpreter, they are parsed in alphabetical order.
Many languages can do better than “foreach”, though: “for i=1 to 99 step 3
“, for example, to step through 1,4,7,10 .. 91, 94, 97.
We can do this with a while
loop.
while loops
While loops are not quite as simple as for loops; they have some kind of condition to match; when the condition does not match, the loop will exit.
The examples above, stepping through from 1 to 100 in increments of 3 (1, 4, 7, 10, … 91, 94, 97), can easily enough be done with a while
loop:
$ i=1 $ while [ "$i" -lt "100" ] > do > echo $i > i=`expr $i + 3` > done 1 4 7 ... 91 94 97
The “i=`expr $i + 3`
” means “increment ‘i’ by 3” (“i = i + 3
” in most other languages).
The “-lt” means “is less than” (“-le” means “is less than or equal too; see “man test”, or http://steve-parker.org/sh/test.shtml and http://steve-parker.org/sh/quickref.shtml)