Learn Bash Scripting

Bash Basics

Chapter #8: For, While and Until Loops

In the penultimate chapter of the Bash Basics series, learn about for, while and until loops.

Loops are a powerful feature in any programming language. If you do not know already, the loops are a way to repeat the code based on certain criteria.

For example, imagine that you have to print the numbers from 1 to 10. You can write the echo command ten times but that's very primitive. You use a loop and in 3-4 lines of code, it can be done.

That's the simplest of the examples I could think of. I am going to share actual useful examples while I discuss the bash loops with you.

There are three types of loops in Bash:

  • For
  • While
  • Until

I'll show all three kinds of looping in the tutorial. Let's start with the most common one.

For loop in bash

Here's the syntax for 'for loop' in bash:

for arg in LIST; do
 commands
done

The LIST here could be an array or a list of items. Brace expansions are also popular for looping.

Take the simplest scenario I mentioned in the beginning. Let's print numbers from 1 to 10 using for loop:

#!/bin/bash

for num in {1..10}; do
	echo $num
done

If you run it, you should see an output like this:

abhishek@itsfoss:~/bash_scripts$ ./for-loop.sh
1
2
3
4
5
6
7
8
9
10

You could have also used for num in 1 2 3 4 5 6 7 8 9 10; do but using the brace expansion makes the code look shorter and smarter.

{..} is used for expanding on a pattern. You use {d..h} and it is equivalent to d e f g h . More on brace expansion can be found in this article.

Using Brace Expansion in Bash Shell
Brace expansion in the bash shell is a lesser known but an awesome feature. Learn about using them like a Pro Linux user with practical examples.
πŸ’‘
If you are familiar with C programming, you may like using the C-styled for loops in bash:

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

Let's see another example that displays all the contents of an array in bash:

#!/bin/bash

distros=(Ubuntu Fedora Debian Alpine)

for i in "${distros[@]}"; do
	echo $i
done

If you run the script, it will display all the distros defined in the array:

Ubuntu
Fedora
Debian
Alpine

While loop in bash

The while loop tests a condition and then keeps on looping as long as the condition is true.

while [ condition ]; do
  commands
done

If you take the previous example, it can be rewritten using the while loop like this:

#!/bin/bash

num=1
while [ $num -le 10 ]; do
	echo $num
	num=$(($num+1))
done

As you can see, you had to define the variable num to 1 first and then in the loop body, you increase the value of num by 1. The while loop checks the condition and runs it as long as num is less than or equal to 10.

Thus, running the script now will show the exact result you saw earlier with for loop.

1
2
3
4
5
6
7
8
9
10

Let's see another example. Here's a bash script that takes a number as an argument and displays its table.

#!/bin/bash

echo "Table for $1 is:"
index=1
while [ $index -le 10 ]; do
	echo $(($1*$index))
	index=$(($index+1))
done

If you are confused about the use of $1, it represents the first argument passed to the script. Check out chapter 3 of this series for more details.

If you run the script, it should show this output:

abhishek@itsfoss:~/bash_scripts$ ./table.sh 2
Table for 2 is:
2
4
6
8
10
12
14
16
18
20

Until loop in bash

This is the lesser-used loop format. It behaves similarly to the while loop. The difference here is that the loop runs until the condition it checks is true. This means for the code in the loop to execute, the condition in [ ] has to be false.

I'll explain it in a bit. Let's see its syntax first.

until [ condition ]; do
  commands
done

Now, if I have to use the same example of printing numbers from 1 to 10 using until loop, it would look like this:

#!/bin/bash

num=1
until [ $num -gt 10 ]; do
	echo $num
	num=$(($num+1))
done

The difference is in the condition; the rest remains the same.

  • The while loop ran while the variable num was less than or equal to 10. The condition in [ ] has to be true for the loop to execute.
  • The until loop runs until the variable num becomes greater than 10. The condition in `[ ]` has to be false for the loop to execute.

Both are different ways of doing the same thing. While is more popular as you'll find a while loop equivalent in most programming languages.

πŸ‹οΈ Exercise time

That was fun. Time to do some exercise now.

Exercise 1: Write a script that takes a number as an argument and prints its table. Your script should also show a message if the script is run without an argument.

Expected output:

$: ./table.sh
You forgot to enter a number

$: ./table.sh 3
3
6
9
12
15
18
21
24
27
30

Exercise 2: Write a script that lists all the files in the directory /var

Hint: Use for loop with /var/* as the 'list'.

You can discuss your answers in this dedicated thread in the Community:

Practice Exercise in Bash Basics Series #8: For, While and Until Loops
If you are following the Bash Basics series on It’s FOSS, you can submit and discuss the answers to the exercise at the end of the chapter: Fellow experienced members are encouraged to provide their feedback to new members. Do note that there could be more than one answer to a given problem.

The bash basics series is coming to an end. As the final chapter in the series, you'll learn to use functions in bash scripting next week. Stay tuned.