Bash For Loop

Bash Scripting for loop examples

for loops

The for loop can be used to repeat a given set of instructions over and over again. It can be used to read a list of items that need to be processed. These items can be names, file names, numbers, variables. The basic syntax of a for loop is as follows:

Syntax of a for loop:


for i in item1 item2 item3 item4 item5
  echo $i

In the above example, our list is read into the variable $i one item at a time. The code between the "do" and "done" statement is executed for each item read into $i. For example, the output below is from the above script:

Output from above for loop script

john@john-desktop:~/scripts$ ./ 

for loop using the contents of a variable

As we saw in the previous example, our list is read into the variable $i. Instead of passing a list, we could have passed a variable that contained a list:


file_list="/home/john/scripts/test1.txt /home/john/scripts/test2.txt /home/john/scripts/test3.txt"

for files in $file_list
  [ -f $files ] && echo "file: $files exists" || echo "file: $files is missing"

In the above example a variable $file_list has been given a list of files. This list is read one at a time into a variable called $files. We then carry out a test for the presence of the file using the file object test "[ -f $files ]. If the file exists we execute the echo statement "file....exists". If the file doesn't exist we then execute the " missing" statement.

Output from the above script

john@john-desktop:~/scripts$ ./ 
file: /home/john/scripts/test1.txt exists
file: /home/john/scripts/test2.txt is missing
file: /home/john/scripts/test3.txt exists

From the above we can see that two of the files have been found and one of the files is missing.

Processing the contents of a file using a for loop

Another useful way a "for loop" can be used is to process the contents of a file. In the example that follows, I have created a simple script that creates new users that are listed within a file. This can be useful if you have numerous users to create.

Useradd script with for loop


echo "Running Script as user $USER "


for i in $(cat ./userlist.txt)
      echo "Adding user $i"
      useradd -m -c "$i" $i
      echo "Return code: $?"
      echo "Record processed are $count"

echo "Last lines form /etc/passwd follow"

tail -n $count /etc/passwd

The above script starts by displaying who has executed the script. This information is held within the variable $USER

The variable $count is set to a value of "0" initially as we will be using this variable to keep count of how many users have been added from the file.

The line for i in $(cat ./userlist.txt) uses command substitution to read the contents of the file userlist.txt.

The "do....done section contains the commands that are to be executed against each entry that was read from the file userlist.txt. Here we use the "useradd" command to create new users. The return code from this command is displayed by the echo "Return code: $?" line. Our running count variable $count is incremented by 1 to keep track of how many records are processed. The last line tail -n $count /etc/passwd displays the associated entries in the passwd file for the new users.

Contents of userlist.txt

root@john-desktop:/home/john/scripts# cat userlist.txt 
root@john-desktop:/home/john/scripts# cat 

Output from the above script

root@john-desktop:/home/john/scripts# ./ 
Running Script as user root 
Adding user test1
Return code: 0
Record processed are 1
Adding user test2
Return code: 0
Record processed are 2
Adding user test3
Return code: 0
Record processed are 3
Last lines form /etc/passwd follow