In this new tutorial we will learn how to use Bash conditions and how to use them in your different shell scripts. Conditions are one of the fundamental concepts in programming. It also allows you to execute or not execute a piece of code depending on the conditions you define. This makes it possible to create scripts that are more complex and can solve more important tasks.
Without further delay let’s start this tutorial!
Bash If Statement
This is the simplest form of the if statement. Its principle is very simple. If the expression in the condition is respected then the condition IF gives as value True and so the code block is executed ( As shown in the diagram below)
Its syntax is as follows:
if EXPRESSIONS then STATEMENTS fi
The if statement always starts with the keyword “if”. This keyword is followed by the expression you want to test. The instruction block is always between the keyword “then” and “fi” which indicates the end of the statement block in the if statement.
Let’s take as an example this following shell script which allows to check if a person is major or not :
#!/bin/bash echo -n "Enter an age: " read AGE if [[ $AGE -gt 17 ]] then echo "You are of legal age" fi
You can save this code in a testif.sh file to test by yourself from the command line:
Result: Enter an age: 18 You are of legal age
The shell script will ask you to enter your age. If your age is over 17 (18 and over) the condition will be respected and the code will execute the echo command which tells you that you are over 18. What happens if you enter an age lower than 18? It will not happen at all since the condition is not respected. To deal with this kind of situation there is the ELSE statement that allows to solve this.
Note : It is recommended that you always indent your code and separate the code blocks with blank lines. This allows your code to be more readable and organized. You can either use an indentation of 2 or 4 spaces.
Bash If..Else Statement
The syntax of the if..else statement is :
if EXPRESSION then STATEMENTS1 else STATEMENTS2 fi
STATEMENT1 will be executed only if the expression is true. If not, STATEMENT2 will be executed instead.
Note : There can only be one ELSE clause in an IF statement.
Let’s go back to the previous script that determines if you are over 18 or not:
#!/bin/bash echo -n "Enter an age: " read AGE if [[ $AGE -gt 17 ]] then echo "You are of legal age" else echo "you are a minor" fi
This time if you enter an age under 18, the program will return the message “you are a minor”.
Bash if..elif..else Statement
The syntax of the if..elif..else statement is :
if EXPRESSION1 then STATEMENTS1 elif EXPRESSION2 then STATEMENTS2 else STATEMENTS3 fi
STATEMENT1 will be executed if EXPRESSION1 is true. If it is not the case STATEMENT2 will be executed if EXPRESSION2 is true. STATEMENT3 will be executed if neither expression is true.
Note : The conditions are executed sequentially. That is, the program will first check the first condition and then the second if the first condition is wrong and so on.
Here’s an example that explains this:
#!/bin/bash echo -n "Enter an age: " read AGE if [[ $AGE -gt 17 ]] then echo "You are of legal age" elif [[ $AGE -gt 10 ]] then echo "you're a teenager" else echo "you are a child" fi
Bash Nested if Statements
It is possible to nest several if statements in bash. This makes it possible to test several conditions. Here is a syntax showing a use case for nested IF statements :
if EXPRESSION1 then if EXPRESION2 then STATEMENT1 else STATEMENT2 fi else if EXPRESSION3 then STATEMENT2 else STATEMENT4 fi fi
Here’s an example:
value=$( grep -ic "amiradata" /etc/passwd ) if [ $value -ge 1 ] then if [ $value -eq 1 ] then echo "Amiradata : 1" elif [ $value -eq 2 ] then echo "Amiradata : 2" fi else echo "I dont found amiradata :(" fi
Note : It is preferable to use the CASE statement which is more readable than nested if statements.
Bash Boolean Operations
The logical operators AND and OR allows you to test several conditions in IF statements :
- AND : &&
- OR : ||
if [[ -n $1 ]] && [[ -r $1 ]] then echo "File exists and is readable" fi
The IF statement will check whether variable $1 is not empty AND whether variable $1 is readable or not. If both conditions are met then the program will display the ECHO message.
if [[ -z $1 ]] || [[ ! -r $1 ]] then echo "Either you didn't give me a value or file is unreadable" fi
The IF statement will check whether variable $1 is not empty OR whether variable $1 is readable or not. If both conditions are met then the program will display the ECHO message.
In our previous examples we have used the operator “-gt” to see if a person is an adult or not. This is called testing. These basic tests are a set of operators that you can use in our conditions to compare values with each other.
These different tests are available using the following command:
$ help test
There are mainly 3 options :
- Write conditions on the file and directories: whether they exist, whether it is a character file, a device file, etc.
- Write the conditions on the numbers: if they are equal to each other, if one is less than the other.
- Conditions for writing to strings: if a string variable is defined or if two strings are different from each other.
Bash File Conditions
These conditions are used to test if, for example, a file exists or not, if it is a directory etc..
Here is the list of tests available in bash :
|-e||Checks if the file exists or not|
|-ré||Checks if the file is a directory|
|-c||Checks if the file is a character device|
|-b||Checks if the file is a block device|
|f1 -nt f2||If file f1 is newer than file f2|
|f1 -ot f2||If file f1 is older than file f2|
|-r||The file can be read|
|-w||The file can be edited|
|-x||The file can be executed|
Here is an example to check if the file exists :
#!/bin/bash # Checking the first argument provided if [[ -e $1 ]] then echo "This file exists" else echo "This file doesn't exists" fi
Bash Number Conditions
Basic number conditions are used to compare two numbers. Here are the different possible comparisons in bash :
|number1 -eq number2||Check if the numbers are equal|
|number1 -ne number2||Check if the numbers are not equal|
|number1 -lt number2||Checking if number1 is less than number2|
|number1 -le number2||Less than or equal to number2|
|number1 -gt number2||Greater than number2|
|number1 -ge number2||Greater than or equal to number2|
For example, to verify that a number is less than or equal to 100, we will write:
#!/bin/bash if [[ $1 -le 100 ]] then echo "the number in argument is less than or equal to 100" else echo "the number in argument is greater than 100 " fi
Bash String Conditions
Here is a table of the main conditions of the Bash chain:
|string1 = string2||Checks if the strings are equal or not|
|string1 != string2||Checks if the strings are different|
|-z string1||Check if string1 is empty|
|-n string1||Checks if string1 is not empty|
Here is an example to check if a string is not empty :
#!/bin/bash if [[ -n $1 ]] then echo "Not empty" else echo "Empty" fi
- if : represents the condition you want to check
- then : if the previous condition is true, then execute a specific statement
- elif : used to add an additional condition to your statement
- else : if the previous condition is false, then run another command
- fi : closes the “if, elif, then” statement
- && : Perform the and operation
- || : Perform the or operation
We are coming to the end of the tutorial, I hope this one will be useful in the creation of your shell scripts. If you want to know more about the shell, I advise you to read this book (As an Amazon Partner, I make a profit on qualifying purchases) :