Skip to content
Joachim Ansorg edited this page Oct 31, 2022 · 2 revisions

This $? refers to echo/printf, not a previous command. Assign to variable to avoid it being overwritten.

Problematic code:

mycommand
echo "Command exited with $?"
if [ $? -ne 0 ]
then
  echo "Failed"
fi

Correct code:

mycommand
ret=$?
echo "Command exited with $ret"
if [ $ret -ne 0 ]
then
  echo "Failed"
fi

Rationale:

ShellCheck found a $? that always refers to echo or printf.

This most commonly happens when trying to show $? before doing something with it, without realizing that any such action will also overwrite $?.

In the problematic example, echo "Command exited with $?" was intended to show the exit code before acting on it, but the act of showing $? also overwrote it, so the condition is always false. The solution is to assign $? to a variable first, so that it can be used repeatedly.

Exceptions:

If you intentionally refer to echo to get the result of a write, you can ignore this message. Alternatively, write it out as in if echo $$ > "$pidfile"; then status=0; else status=1; fi

Related resources:

  • 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