Skip to content
Vidar Holen edited this page Oct 4, 2015 · 8 revisions

You probably wanted && here

Problematic code:

if [[ $1 != foo || $1 != bar ]]
then
  echo "$1 is not foo or bar"
fi

Correct code:

if [[ $1 != foo && $1 != bar ]]
then
  echo "$1 is not foo or bar"
fi

Rationale:

This is not a bash issue, but a simple, common logical mistake applicable to all languages.

[[ $1 != foo || $1 != bar ]] is always true:

  • If $1 = foo then $1 != bar is true, so the statement is true.
  • If $1 = bar then $1 != foo is true, so the statement is true.
  • If $1 = cow then $1 != foo is true, so the statement is true.

[[ $1 != foo && $1 != bar ]] matches when $1 is not foo and not bar:

  • If $1 = foo, then $1 != foo is false, so the statement is false.
  • If $1 = bar, then $1 != bar is false, so the statement is false.
  • If $1 = cow, then both $1 != foo and $1 != bar is true, so the statement is true.

This statement is identical to ! [[ $1 = foo || $1 = bar ]], which also works correctly.

Exceptions

None.

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally