Skip to content
Jake Zimmerman edited this page Jun 5, 2019 · 2 revisions

Use [ -n .. ] instead of ! [ -z .. ].

(or "Use [ -z .. ] instead of ! [ -n .. ].)

Problematic code:

if ! [ -n "$JAVA_HOME" ]; then echo "JAVA_HOME not specified"; fi
if ! [ -z "$STY" ];       then echo "You are already running screen"; fi

Correct code:

if [ -z "$JAVA_HOME" ]; then echo "JAVA_HOME not specified"; fi
if [ -n "$STY" ];       then echo "You are already running screen"; fi

Rationale:

You have negated test -z or test -n, resulting in a needless double-negative. You can just use the other operator instead:

# Identical tests to verify that a value is assigned
! [ -z foo ] # Not has no value
[ -n foo ]   # Has value

# Identical tests to verify that a value is empty
! [ -n foo ] # Not is non-empty
[ -z foo ]   # Is empty

Exceptions:

This is a stylistic issue that does not affect correctness. If you prefer the original expression, you can't not Ignore it with a directive or flag.

Related resources:

  • Google Bash Style Guide on Testing Strings
  • 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