$?refers to echo/printf, not a previous command. Assign to variable to avoid it being overwritten.
mycommand echo "Command exited with $?" if [ $? -ne 0 ] then echo "Failed" fi
mycommand ret=$? echo "Command exited with $ret" if [ $ret -ne 0 ] then echo "Failed" fi
ShellCheck found a
$? that always refers to
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.
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
ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.