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 S001. Use GitHub "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally