Clone
1
SC3062
Vidar Holen edited this page 2025-04-08 11:09:44 -07:00

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.

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