Evaluate Multiple Conditions in Bash “If” Statement [2 Ways]

Including multiple conditions within an if statement in Bash refers to evaluating several criteria simultaneously by combining them with logical operators AND and OR within a single if block. You can either use the single square brackets “[ ]” i.e. equivalent test operator or double square brackets “[[ ]]” with extended functionality to encapsulate all the conditions and perform a complex conditional check.

In this article, I will exemplify 2 ways to evaluate multiple conditions within an ‘if’ condition in Bash.

What is Compound “If” in Bash?

In Bash scripting, ‘compound if’ is a statement that includes multiple conditions within an ‘if’ statement. It uses the logical operators AND, OR, and compound conditionals all together.

This is useful when you have to execute a specific block of code based on the number of satisfied conditions. The basic structure of a ‘compound if’ statement is as follows:

if [ condition1 ] && [ condition2 ]; then
#Code to execute if both conditions are true
fi

Or,

if [ condition1 ] || [ condition2 ]; then
#Code to execute if at least one condition is true
fi

2 Methods to Use Multiple Conditions in Bash “If” Statement

To check multiple conditions in a Bash if statement, you can employ both [ ] and [[ ]] constructs. The following is a description of how you can assess multiple conditions by combining them either using a single construct or using individual structures in Bash ‘if’ statements.

1. Using Single Square Brackets “[ ]”

In Bash scripting, the single square brackets [ ] are considered as the equivalent test command that evaluates multiple conditions within an ‘if’ statement. In this case, the logical operators -a and -o can be used to combine all the conditions within a conditional expression where -a is a logical AND and -o is a logical OR.

To evaluate multiple conditions using -a and -o within one test alias, use the syntaxes as follows:

if [ CONDITION1 -a CONDITION2 ]; #True if both CONDITION1 and CONDITION2 are true.
if [ CONDITION1 -o CONDITION2 ]; #True if either CONDITION1 or CONDITION2 is true.

Here’s an example:

#!/bin/bash

#Defining a variable
value=20

#Checking if a number is within a specified range
if [ "$value" -lt 35 -a "$value" -gt 18 ]; then
echo "Number $value is within 18 and 35."
fi

EXPLANATION

In the script, if [ "$value" -lt 35 -a "$value" -gt 18 ]; checks if the defined value is less than 35 and greater than 18. If both conditions are satisfied, the script returns a true expression.

Checking multiple conditions using -a (logical AND) within one '[ ]'

From the above image, you can see that multiple conditions are satisfied using -a within the “[ ]” construct.

Individual “[ ]” Construct for Each Condition

To evaluate multiple conditions within individual single square brackets [ ], use the syntaxes if [ CONDITION1 ] && [ CONDITION2 ]; and if [ CONDITION1 ] || [ CONDITION2 ];.

Following is an example indicating the usage of individual single square brackets to handle multiple conditions:

#!/bin/bash

read -p "Enter your favorite color: " color

#Checking if the entered color matches with the condition
if [ "$color" = "Black" ] || [ "$color" = "Blue" ] || [ "$color" = "White" ]; then
echo "Valid color entered."
fi

EXPLANATION

Here, the if statement validates whether the entered color matches with any of the specified colors (Black, Blue or White). If any of the conditions becomes true, it prints ‘Valid color entered.’.

Checking multiple conditions using logical OR operator within individual '[ ]'

The above snapshot is a clear demonstration of multiple conditional checks using individual “[ ]” with “||”.

2. Using Double Square Brackets “[[ ]]”

Using double square brackets [[ ]] with && (logical AND) and || (logical OR) helps in assessing multiple conditions within an ‘if’ statement.

To evaluate multiple conditions combined by && and || within one [[ ]] construct, use the syntaxes below:

if [[ CONDITION1 && CONDITION2 ]]; #True if both CONDITION1 and CONDITION2 are true.
if [[ CONDITION1 || CONDITION2 ]]; #True if either CONDITION1 or CONDITION2 is true.

Look into the following example:

#!/bin/bash

#Defining two variables
class="8"
age=14

#Checking if two conditions are met
if [[ "$class" -le 10 && "$age" -ge 10 ]]; then
echo "Two conditions are met."
fi

EXPLANATION

Here, if [[ "$class" -le 10 && "$age" -ge 10 ]]; checks if the defined variable class is less than 10 and the variable age is greater than 10. If both conditions are met, the script displays ‘Two conditions are met.’.

Checking multiple conditions using AND operator within one '[[ ]]'

This image states two conditional checks using “[[ ]]” with “&&” where two conditions were satisfied.

Individual “[[ ]]” Construct for Each Condition

To assess multiple conditions within an ‘if’ statement, use double square brackets notation individually combining them with && and ||. For instance:

#!/bin/bash

read -p "Enter a filename: " filename

#Checking if one condition is met
if [[ "${filename##*.}" = "txt" ]] || [[ "${filename##*.}" = "conf" ]]; then
echo "One extension is found."
fi

EXPLANATION

In this script, the ‘if’ conditional checks whether the filename specified by the user has an extension of either txt or conf, where ${filename##*.} extracts the extension from the filename using parameter expansion. If the filename’s extension matches any of these two conditions, the script returns a true expression.

Checking multiple conditions using OR operator within individual '[[ ]]'

This image illustrates the use of “[[ ]]” with “||” to evaluate multiple conditions.

Conclusion

To sum up, using multiple conditions within a Bash ‘if’ statement is a great way to test different scenarios of your scripts and make them more diverse and responsive.

People Also Ask

How can I check multiple conditions where at least one condition should be true?

You can use the OR (||) operator to check multiple conditions where at least one condition should be true.

Can I use variables to store conditions in Bash if statements?

Yes, you can use variables to store conditions and evaluate them within Bash ‘if’ statements. For example:

#!/bin/bash

#Defining conditions in variables
condition1="-f /home/nadiba/to/local.txt" #Providing information in /path/to/file_name
condition2="-d /home/nadiba/to/Desktop" #Providing information in /path/to/directory

#Checking if both conditions are met
if [ "$condition1" ] && [ "$condition2" ]; then
echo "Both conditions are met.
fi

How do I ensure correct evaluation order when combining multiple conditions?

To ensure correct evaluation order when combining multiple conditions, you can use parentheses that explicitly help in preventing issues encountered with condition precedence.

Can I use functions to encapsulate complex conditions for readability?

Yes, you can use functions to encapsulate complex conditions for better code structure and readability. For example:

#!/bin/bash

file_check() {

local file_name=$1

if [ -e "$file_name" ]; then
echo "'$file_name' exists."
if [ -f "$file_name" ]; then
echo "'$file_name' is a regular file."
elif [ -d "$file_name" ]; then
echo "'$file_name' is a directory."
else
echo "'$file_name' is a special file."
fi
else
echo "'$file_name' does not exist."
fi
}

#Calling function
file_check "color.txt"

Can I nest multiple if statements to handle complex conditions?

Yes, you can nest if statements to handle complex conditions. However, excessive nesting can make it difficult to read and keep track of the code. You can use logical operators AND and OR instead. Let’s see an example:

#!/bin/bash

read -p "Enter your mark: " mark

if [ "$mark" -ge 30 ]; then
echo "You have passed the exam."
if [ "$mark" -ge 50 ]; then
echo "You have a good grade."
else
echo "It is a bad grade."
fi
else
echo "You have failed the exam."
fi

What’s the recommended approach for handling a large number of conditions?

When handling a large number of conditions, it’s recommended to use case statements or put the conditions in arrays to improve code maintainability. For example:

#!/bin/bash

read -p "Enter a value from 1 to 5: " number

case $number in
1)
echo "Valid number: One."
;;
2)
echo "Valid number: Two."
;;
3)
echo "Valid number: Three."
;;
4)
echo "Valid number: Four."
;;
5)
echo "Valid number: Five."
;;
*)
echo "Invalid number."
;;
esac

Related Articles


<< Go Back to If Statement in Bash | Bash Conditional Statements | Bash Scripting Tutorial

Rate this post
Nadiba Rahman

Hello, This is Nadiba Rahman, currently working as a Linux Content Developer Executive at SOFTEKO. I have completed my graduation with a bachelor’s degree in Electronics & Telecommunication Engineering from Rajshahi University of Engineering & Technology (RUET).I am quite passionate about crafting. I really adore exploring and learning new things which always helps me to think transparently. And this curiosity led me to pursue knowledge about Linux. My goal is to portray Linux-based practical problems and share them with you. Read Full Bio

Leave a Comment