Learn Bash Scripting

Bash Basics

Chapter #7: If Else Statement

If this, then that else something else. Doesn't make sense? It will after you learn about the if-else statements in bash shell scripting.

Bash supports if-else statements so that you can use logical reasoning in your shell scripts.

The generic if-else syntax is like this:

if [ expression ]; then

  ## execute this block if condition is true else go to next

elif [ expression ]; then

  ## execute this block if condition is true else go to next

else 

  ## if none of the above conditions are true, execute this block

fi

As you can notice:

  • elif is used for "else if" kind of condition
  • The if else conditions always end with fi
  • the use of semicolon ; and then keyword

Before I show the examples of if and else-if, let me share common comparison expressions (also called test conditions) first.

Test conditions

Here are the test condition operators you can use for numeric comparison:

Condition Equivalent to true when
$a -lt $b $a < $b ($a is less than $b)
$a -gt $b $a > $b ($a is greater than $b)
$a -le $b $a <= $b ($a is less or equal than $b)
$a -ge $b $a >= $b ($a is greater or equal than $b)
$a -eq $b $a is equal to $b
$a -ne $b $a is not equal to $b

If you are comparing strings, you can use these test conditions:

Condition Equivalent to true when
"$a" = "$b" $a is same as $b
"$a" == "$b" $a is same as $b
"$a" != "$b" $a is different from $b
-z "$a" $a is empty

There are also conditions for file type check:

Condition Equivalent to true when
-f $a $a is a file
-d $a $a is a directory
-L $a $a is a link

Now that you are aware of the various comparison expressions let's see them in action in various examples.

Use if statement in bash

Let's create a script that tells you if a given number is even or not.

Here's my script named even.sh:

#!/bin/bash

read -p "Enter the number: " num

mod=$(($num%2))

if [ $mod -eq 0 ]; then
	echo "Number $num is even"
fi

The modulus operation (%) returns zero when it is perfectly divided by the given number (2 in this case).

🚧
Pay special attention to space. There must be space between the opening and closing brackets and the conditions. Similarly, space must be before and after the conditional operators (-le, == etc).

Here's what it shows when I run the script:

Running a script with if statement example in bash

Did you notice that the script tells you when a number is even but it doesn't display anything when the number is odd? Let's improve this script with the use of else.

Use if else statement

Now I add an else statement in the previous script. This way when you get a non-zero modulus (as odd numbers are not divided by 2), it will enter the else block.

#!/bin/bash

read -p "Enter the number: " num

mod=$(($num%2))

if [ $mod -eq 0 ]; then
	echo "Number $num is even"
else
	echo "Number $num is odd"
fi

Let's run it again with the same numbers:

Running a bash script that checks odd even number

As you can see, the script is better as it also tells you if the number is odd.

Use elif (else if) statement

Here's a script that checks whether the given number is positive or negative. In mathematics, 0 is neither positive nor negative. This script keeps that fact in check as well.

#!/bin/bash

read -p "Enter the number: " num

if [ $num -lt 0 ]; then
	echo "Number $num is negative"
elif [ $num -gt 0 ]; then
	echo "Number $num is positive"
else
	echo "Number $num is zero"
fi

Let me run it to cover all three cases here:

Running a script with bash elif statement

Combine multiple conditions with logical operators

So far, so good. But do you know that you may have multiple conditions in a single by using logical operators like AND (&&), OR (||) etc? It gives you the ability to write complex conditions.

Let's write a script that tells you whether the given year is a leap year or not.

Do you remember the conditions for being a leap year? It should be divided by 4 but if it is divisible by 100, it's not a leap year. However, if it is divisible by 400, it is a leap year.

Here's my script.

#!/bin/bash

read -p "Enter the year: " year

if [[ ($(($year%4)) -eq 0 && $(($year%100)) != 0) || ($(($year%400)) -eq 0) ]]; then
	echo "Year $year is leap year"
else
	echo "Year $year is normal year"
fi
πŸ’‘
Notice the use of double brackets [[ ]] above. It is mandatory if you are using logical operators.

Verify the script by running it with different data:

Example of running  bash script with logical operators in if statement

πŸ‹οΈ Exercise time

Let's do some workout :)

Exercise 1: Write a bash shell script that checks the length of the string provided to it as an argument. If no argument is provided, it prints 'empty string'.

Exercise 2: Write a shell script that checks whether a given file exists or not. You can provide the full file path as the argument or use it directly in the script.

Hint: Use -f for file

Exercise 3: Enhance the previous script by checking if the given file is regular file, a directory or a link or if it doesn't exist.

Hint: Use -f, -d and -L

Exercise 4: Write a script that accepts two string arguments. The script should check if the first string contains the second argument as a substring.

Hint: Refer to the previous chapter on bash strings

You may discuss your solution in the Community:

Practice Exercise in Bash Basics Series #7: If Else Statements
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.

I hope you are enjoying the Bash Basics Series. In the next chapter, you'll learn about using loops in Bash.

Bash Basics #8: For, While and Until Loops
In the penultimate chapter of the Bash Basics series, learn about for, while and until loops.

Keep on bashing!