KrnlPanic's Linux Notes and Tips

Working with linux since kernel version 2.0.30

Using a ‘for loop’ in linux bash shell

The for loop in a unix/linux shell is used to execute the same thing over and over again, or iteratively. Here are a few examples of simple for loop usage.

The following loop goes through all files names *.jpg and runs the command ‘identify’ for each one of them to determine image pixel sizes.

From the command line, use semi-colons to separate each statement.

# for i in *.jpg; do identify $i; done

The same for loop in a shell script would look like this:

#!/bin/bash
for i in *.jpg
do
  identify $i
done

The output of either of the above loops would be something like:

file1.jpg JPEG 350×571 350×571+0+0 8-bit DirectClass 24.4KB 0.000u 0:00.010
file2.jpg JPEG 107×140 107×140+0+0 8-bit DirectClass 5.41KB 0.000u 0:00.009
file3.jpg JPEG 700×467 700×467+0+0 8-bit DirectClass 42.4KB 0.000u 0:00.000
file4.jpg JPEG 700×467 700×467+0+0 8-bit DirectClass 40.3KB 0.000u 0:00.000
… and so on until all *.jpg files in the directory were processed.

Another use might be to rename many files in a directory with an “_old”. This method requires getting each file name in the directory ($file), then using ‘sed’ to create a new variable that replaces “.jpg” with _old.jpg” in the filename, then finally moves each file to the new filename.

# for i in *.jpg; do newfile=`echo $i| sed 's/.jpg/_old.jpg/g'`; mv $i $newfile; done

or the same in a bash shell script:

#!/bin/bash
for i in *.jpg
do 
  newfile=`echo $i | sed 's/.jpg/_old.jpg'`
  mv $i $newfile
done

Instead of using a wildcard, you can use a list, as follows:

for i in red green blue yellow orange
do
  echo $i
done

Which, when executed outputs:
red
green
blue
yellow
orange

The last way that I’ll show is using three expressions to loop through an inequality and incrementing after each loop, as follows:

for (( i=1; i<=5; i++ ))
do
   echo "Variable i equals: $i"
done

Which, when executed out puts the following:
Variable i equals: 1
Variable i equals: 2
Variable i equals: 3
Variable i equals: 4
Variable i equals: 5

I hope you found this useful. Leave a comment!
-Krnl

One Comment on “Using a ‘for loop’ in linux bash shell
  • Stuck in a situation where I had to use a windows machine to get some data. Saving a couple of DOS shell for loops here just in case I ever need to refer to them again.

    for /L %x in (1,1,220) do for /f “tokens=1-6 delims=/” %a in (links.txt) do wget -q –no-clobber -U mozilla -O %d_$e_$x.txt %a//%b/%c/%d/%e/%f/%x

    for /L %x in (1,1,220) do for /f “tokens=1-4 delims=/” %a in (newlinks.txt) do wget -q –no-clobber -U mozilla -O C:\Users\Rick\Documents\linksave\%d_$x.txt %a//%b/%c/%d/%x

Leave a Reply