Skip to content
koalaman edited this page May 14, 2015 · 6 revisions

Always true because you failed to quote. Use instead.

Problematic code:

if [ -n $var ]
then
  echo "var has a value"
else
  echo "var is empty"
fi

Correct code:

In bash/ksh:

if [[ -n $var ]]
then
  echo "var has a value"
else
  echo "var is empty"
fi

In POSIX:

if [ -n "$var" ]
then
  echo "var has a value"
else
  echo "var is empty"
fi

Rationale:

When $var is unquoted, a blank value will cause it to wordsplit and disappear. If $var is empty, these two statements are identical:

[ -n $var ]
[ -n ]

[ string ] is shorthand for testing if a string is empty. This is still true if string happens to be -n. [ -n ] is therefore true, and by extension so is [ -n $var ].

To fix this, either use [[ -n $var ]] which has fewer caveats than [, or quote the variable.

Exceptions:

None

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