The if-clause

if <LIST>; then
  <LIST>
fi
if <LIST>; then
  <LIST>
else
  <LIST>
fi
if <LIST>; then
  <LIST>
elif <LIST>; then
  <LIST>
else
  <LIST>
fi

The if-clause can control the script's flow (what's executed) by looking at the exit codes of other commands.

All commandsets <LIST> are interpreted as command lists, thus they can contain the whole palette from simple commands over pipelines to compound commands (and their combination) as condition.

Operation

The if <LIST> commands are executed. If the exit code was 0 (TRUE) then the then <LIST> commands are executed, otherwise the elif <LIST> commands and their then <LIST> statements are executed in turn, if all down to the last one fails, the else <LIST> commands are executed, if one of the elif succeeds, its then thread is executed, and the if-clause finishes.

Basically, the elif clauses are just additional conditions to test (like a chain of conditions) if the very first condition failed. If one of the conditions fails, the else commands are executed, otherwise the commands of the condition that succeeded.

Check if a specific user exists in /etc/passwd :-)

if grep ^myuser: /etc/passwd >/dev/null 2>&1; then
  echo "Yes, it seems I'm real"
else
  echo "Uh - am I a ghost?"
fi

Mount with check

if ! mount /mnt/backup >/dev/null 2>&1; then
  echo "FATAL: backup mount failed" >&2
  exit 1
fi

Multiple commands as condition

It's perfectly valid to do:

if echo "I'm testing!"; [ -e /some/file ]; then
  ...
fi
The exit code that dictates the condition's value is the exit code of the very last command executed in the condition-list (here: The [ … ])

A complete pipe as condition

A complete pipe can also be used as condition. It's very similar to the example above (multiple commands):

if echo "Hello world!" | grep -i hello >/dev/null 2>&1; then
  echo "You just said 'hello', yeah?"
fi

Enter your comment. Wiki syntax is allowed: