Skip to content
Vidar Holen edited this page Apr 8, 2025 · 1 revision

In POSIX sh, unary -o to check options is undefined.

Problematic code:

if [ -o braceexpand ]
then
 echo "Brace expansion available and enabled."
fi

Correct code:

$- will be set to a list of shell options:

case $- of
  *B*) echo "Brace expansion available and enabled."
esac 

However, not all options are available through $-. If you need to check those, ignore this suggestion with a directive:

# shellcheck disable=SC3062
if [ -n "$BASH_VERSION" ] && [ -o pipefail ]
then
  echo "This is bash and pipefail is enabled."
fi

Rationale:

[ -o option ] is a bash/ksh extension, while $- is standard POSIX. Do note that letters outside the POSIX set are not guaranteed to be compatible, such as B above.

Exceptions:

As described.

Related resources:

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!

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