SC2237 – ShellCheck Wiki

See this page on GitHub

Sitemap


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.


ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.