Bash Script 5: Ifs/Tests

Almost every program contains some sort of logical test. This could be just checking to see if it’s a certain time, or if the user enter Y or N. Bash scripting offers a wide variety of tests. Let’s go over some of what’s possible here.

Basic If Structure

If we’re going to be doing a test, we want the program to respond one way if it’s true and another way if it’s false. This is accomplished with the if/then/else/fi bash control structure. Here’s a simple example:

if [ "1" -eq "1" ]
then
  echo "1 equals 1";
else
  echo "1 does not equal 1";
fi

Here we are checking to see if 1 equals 1. Since it does, the code between then and else will be executed. If the test were to be false, then the code between else and fi would be executed.

Number Tests

Let’s say you want to run some checks on 2 numbers. Here are the tests you can run:

a=1
b=2

# Test for equality
if [ "$a" -eq "$b" ]
then
  echo 'They are equal';
fi

# Test for a note qual to b
if [ "$a" -ne "$b" ]
then
  echo 'a is not equal to b';
fi

# Test for a greater than b
if [ "$a" -gt "$b" ]
then
  echo 'a is greater than b';
fi

# Test for a lesser than b
if [ "$a" -lt "$b" ]
then
  echo 'a is lesser than b';
fi

String Tests

Comparing 2 strings is very useful too.

a="asdf"
b="fdsa"

# Test for a equal to b
if [ "$a" = "$b" ]
then
  echo 'a and b are the same'
fi

# Test for a not equal to b
if [ "$a" != "$b" ]
then
  echo 'a and b are not the same'
fi

# Test if the contents of a comes before b, alphabetically
if [[ "$a" < "$b" ]]
then
  echo 'The contents of a come before b'
fi

# Test if a is empty
if [ -z "$a" ]
then
  echo 'a is empty'
fi

# Test if a is not empty
if [ -n "$a" ]
then
  echo 'a is not empty'
fi

Other Tests

There are other tests you can perform as well:

# Check for a file's existence
if [ -f my_file.mkv ]
then
  echo 'Found my_file.mkv';
else
  echo 'Cannot find my_file.mkv';
fi

# Check for non-zero filesize
if [ -s my_file.mkv ]
then
  echo 'File has contents'
fi

# Check if a filename is really a directory
if [ -d my_file.mkv ]
then
  echo 'my_file.mkv is really a directory'
fi