Tuesday, September 16, 2008

The Unix shell For Loop

If you are a programmer or engineer working in a unix or linux environment, you will
probably find the shell 'for' loop to be a handy tool for automating command line tasks.


Here are three examples of the 'for' loop. All the commands are in italics and should be entered on the command line, followed by a carriage return.
Note that, after entering the initial 'for' line, you will get the secondary unix prompt, which is usually a ">".

1. Rename all ".old" files in the current directory to ".bak":

for i in *.old
do
j=`echo $i|sed 's/old/bak/'`
mv $i $j
done


Here, we looped thru all files with extension ".old", setting the variable "i" to be the file name we are currently looping thru. Then, between the "do" and "done", we have the body of the loop. On each pass, we echo the file name ("i") to the unix stream editor sed. Sed replaces the "old" with "bak" (so file "a.old" becomes "a.bak"), and saves the changed name to variable "j". Then, we use the unix move (mv) command to rename the original file (ex. a.old) to the new file (a.bak).





2. Change all instances of "yes" to "no" in all ".txt" files in the current directory.
Back up the original files to ".bak".

for i in *.txt
do
j=`echo $i|sed 's/txt/bak/'`
mv $i $j
sed 's/yes/no/' $j > $i
done


In this case, we rename each file from ".txt" to ".bak". Additionally, we use sed a second time, on the contents of the original file (now with a ".bak" extension) and save the modified text back to the original name (with ".txt").






3. Loop thru a text file containing possible file names.
If the file is readable, print the first line, otherwise print an error message:

for i in `cat file_list.txt`
do
if test -r $i
then
echo "Here is the first line of file: $i"
sed 1q $i
else
echo "file $i cannot be open for reading."
fi
done


Here, we loop thru the results of a command (in this case "cat"), rather than looping thru files in the directory. We also use an if statement with the "test" command to test for a condition (in this case, whether the file is readable).

No comments: