Skip to content
Michael Sobrepera edited this page Feb 20, 2022 · 5 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 Ignore it with a directive or flag.

Related resources:

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!
  • Bash reference manual for -z and -n.
  • Note: Be careful with quoting variables (which you should always do anyway): [ ! -z $var ] might work, but [ -n $var] will not. [ -n "$var" ] will do what you expect.

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