Open In App

Shell Scripting – Decision Making

Last Updated : 21 Apr, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

A Shell script is a plain text file. This file contains different commands for step-by-step execution. These commands can be written directly into the command line but from a re-usability perceptive it is useful to store all of the inter-related commands for a specific task in a single file. We can use that file for executing the set of commands one or more times as per our requirements.

Here in this article, we are going to discuss decision-making within Shell Scripting.

In programming, Decision making is one of the important concepts. The programmer provides one or more conditions for the execution of a block of code. If the conditions are satisfied then those block of codes only gets executed. Two types of decision-making statements are used within shell scripting. They are –

  • If-else statement
  • case-sac statement

Now let’s talk about them one by one.

1. If-else statement

If else statement is a conditional statement. It can be used to execute two different codes based on whether the given condition is satisfied or not. There are a couple of varieties present within the if-else statement. They are –

  • if-fi 
  • if-else-fi 
  • if-elif-else-fi 
  • nested if-else

The syntax will be –

if-fi

if [ expression ]; then

    statements

fi

if-else-fi 

if [ expression ]
then
   statement1
else
   statement2
fi

if-elif-else-fi

if [ expression1 ]
then
   statement1
   statement2
   .
   .
elif [ expression2 ]
then
   statement3
   statement4
   .
   .
else
   statement5
fi

nested if-else

if [ expression ]
then
   statement1
   if [ expression ]
   then
     statement
   else
     statement
   fi    
else
   statement2
fi

Now understand these concepts using examples.

Example of if-fi

Name="Satyajit"
if [ "$Name" = "Satyajit" ]; then
  echo "His name is Satyajit. It is true."
fi

Output

His name is Satyajit. It is true.

In the above example, during the condition checking the name matches and the condition becomes true. Hence, the block of code present within the if block gets executed. In case the name doesn’t match then we will not have an output. Below is the terminal shell pictorial depiction after executing the following script – 

 

Example of if-else-fi 

Age=17
if [ "$Age" -ge 18 ]; then
    echo "You can vote"
else
    echo "You cannot vote"    
fi

Output

You cannot vote

In the above example, during the condition checking the Age is 17, so it doesn’t satisfy the condition of if statement that is the age must be greater than or equal to 18. Hence the code inside the if block will not get executed and the code written inside the else block will get executed. Below is the terminal shell pictorial depiction after executing the following script – 

 

Example of if-elif-else-fi 

Age=17
if [ "$Age" -ge 18 ]; then
    echo "You can vote"
elif [ "$Age" -eq 17 ]; then
    echo "You can vote after one year"
else
    echo "You cannot vote"    
fi

Output

You can vote after one year

In the above example, during the condition checking the Age is 17, so it doesn’t satisfy the condition of if statement that is the age must be greater than or equal to 18 but it has satisfied the elif condition. So, it has executed the code written within the elif block only.

 

 

Example of Nested if-else

echo "Enter subject"
read subject

if [ $subject == 'Linux' ]
then
echo "Enter Marks"
read marks
        if [ $marks -ge 30 ]
        then
        echo "You passed"
        else
        echo "You failed"
        fi
else
echo "Wrong Subject"
fi

Output 1

Enter subject
Linux
Enter Marks
97 
You passed

Output 2

Enter subject
Linux
Enter Marks
29
You failed

Output 3

Enter subject
DBMS
Wrong Subject

In the above example, the if statements are nested, which means one if statement is written inside another one. The following script first checks for the Subject is Linux or not. If the subject is Linux then it goes to the another if statement and that if statement checks for the mark are above to consider as a pass or not.  Below is the terminal shell pictorial depiction after executing the following script – 

 

1.1. Making a file-based decision

The file-based decision is basically a type of decision-making based on whether the file exists or not. A use case of this will be to check for available file permission or to create a file if it is not available etc. A minimal structure of such script can be written as –

 if [ -e gfg.sh ] 
 then 
     echo "file exists" 
 else 
     echo "file does not exist" 
 fi

This can be used to check whether a file exists in the home directory or not.

Example of file-based decision

echo "Enter filename"
read filename

if [ -e $filename ]
then
echo "$filename is exits on the directory"
cat $filename

else
    cat > $filename
    echo "File created"
fi

Output :

First time:

Enter filename
geeks.txt
Hello Geek
File created

Second time:

Enter filename
geeks.txt
geeks.txt is exits on the directory
Hello Geek

So, in this above example the first time, the script could not find any file with that file name, and the else block gets executed. It created the file and put some data into that file. When we run it a second time with the same file name, then it finds the file. So, is the if block gets executed and that displays the contents of the file.  Below is the terminal shell pictorial depiction after executing the following script – 

 

1.2. String-based Condition

The string-based condition means in the shell scripting we can take decisions by doing comparisons within strings as well. Here is a descriptive table with all the operators –

Operator Description
== Returns true if the strings are equal
!=  Returns true if the strings are not equal
-n Returns true if the string to be tested is not null
-z Returns true if the string to be tested is null

Below is the usage of all of them  –

# ==
if [ 'Geeks' == 'Geeks' ];
then
    echo "same" #output
else
    echo "not same"
fi

# !=
if [ 'Geeks' != 'Apple' ];
then
    echo "not same" #output
else
    echo "same"
fi

# -n
if [ -n "Geeks" ];
then
    echo "not null" #output
else
    echo "null"
fi

# -z
if [ -z "Geeks" ];
then
    echo "null"
else
    echo "not null" #output
fi

Output:

same
not same
not null
not null

Below is the terminal shell pictorial depiction after executing the following script – 

 

1.3. Arithmetic-based Condition

Arithmetic operators are used for checking the arithmetic-based conditions. Like less than, greater than, equals to, etc. Here is a descriptive table with all the operators –

Operator Description
-eq Equal
-ge Greater Than or Equal
-gt Greater Than
-le Less Than or Equal
-lt  Less Than
-ne Not Equal

Below is the usage of all of them  –

# -eq
if [ 10 -eq 10 ];then
echo "Equal"
fi

# -ge
if [ 10 -ge 9 ];then
echo "Greater or equal"
fi

# -gt
if [ 10 -gt 8 ];then
echo "Greater"
fi

# -le
if [ 10 -le 12 ];then
echo "Less than or equal"
fi

# -lt
if [ 10 -lt 13 ];then
echo "Less than"
fi

# -ne
if [ 10 -ne 13 ];then
echo "Not Equal"
fi

Output:

Equal
Greater or equal
Greater
Less than or equal
Less than
Not Equal

Below is the terminal shell pictorial depiction after executing the following script – 

 

2. The case-sac statement

case-sac is basically working the same as switch statement in programming. Sometimes if we have to check multiple conditions, then it may get complicated using if statements. At those moments we can use a case-sac statement. The syntax will be –

case $var in
   Pattern 1) Statement 1;;
   Pattern n) Statement n;;
esac

Example of case-sac statement

Name="Satyajit"
case "$Name" in
    #case 1
    "Rajib") echo "Profession : Software Engineer" ;;
    
    #case 2
    "Vikas") echo "Profession : Web Developer" ;;
    
    #case 3
    "Satyajit") echo "Profession : Technical Content Writer" ;;
esac

Output

Profession : Technical Content Writer

In the above example, the case-sac statement executed the statement which is a part of the matched pattern here the ‘Name’. Below is the terminal shell pictorial depiction after executing the following script – 

 



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads