SC2332 – ShellCheck Wiki

See this page on GitHub

Sitemap


[ ! -o opt ] is always true because -o becomes logical OR. Use [[ ]] or ! [ -o opt ].

Or "[ ! -a file ] is always true because -a becomes logical AND. Use -e instead."

Problematic code:

if [ ! -o braceexpand ]
then 
  ..
fi

Correct code:

if [[ ! -o braceexpand ]]
then 
  ..
fi

or

if ! [ -o braceexpand ]
then 
  ..
fi

Rationale:

Bash interprets [ ! -o opt ] as [ "!" ] || [ "opt" ] instead of negating the condition. As a result, the condition is always true.

Avoid this by using [[ ! -o opt ]] or ! [ -o opt ].

The same issue applies to [ ! -a file ], but this is easier fixed using POSIX standard [ ! -e file ].

Exceptions:

None.


ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.