Prefer explicit -n
to check for output (or run command without [
/[[
to check for success)
Problematic code:
if [ "$(mycommand --myflags)" ]
then
echo "True"
fi
Correct code:
# Check that the command outputs something on stdout
if [ -n "$(mycommand --myflags)" ]
then
echo "The command had output on stdout"
fi
# Check instead that the command succeeded (exit code = 0)
if mycommand --myflags
then
echo "The command reported success"
fi
(if the command instead outputs "0" or "false", see SC2244 for integer and "boolean" comparisons)
Rationale:
[ "$(mycommand)" ]
is equivalent to [ -n "$(mycommand)" ]
and checks whether the command's output on stdout was non-empty.
Users more familiar with other languages are often surprised to learn that it is nothing like e.g. if (myfunction())
, since it does not care about what the command/function return
s.
Using an explicit -n
helps clarify that this is purely a string operation. And of course, if the intention was to check whether the command ran successfully, now would be a good time to fix it as in the alternate example.
Exceptions:
If you are familiar with the semantics of [
, you can ignore this suggestion with no ill effects.
Related resources:
- Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!
-
Installation
-
Usage
-
Integrating and extending
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.