You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 ]
thenecho"Failed"fi
Correct code:
mycommand
ret=$?echo"Command exited with $ret"if [ $ret-ne 0 ]
thenecho"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!