Skip to content

Files

Latest commit

 

History

History
38 lines (26 loc) · 1.25 KB

SC2319.md

File metadata and controls

38 lines (26 loc) · 1.25 KB

Pattern: $? refers to a condition

Issue: -

Description

ShellCheck found a $? that always refers to a condition like [ .. ], [[ .. ]], or test.

This most commonly happens when trying to inspect $? before doing something with it, such as inspecting it again or exiting with it, without realizing that any such inspection will also overwrite $?.

In the first problematic example, [ $? -ne 14 ] will never be true because it only runs after [ $? -ne 0 ] has modified $? to be 0. The solution is to assign $? from mycommand to a variable so that the variable can be inspected repeatedly.

In the second problematic example, exit $? will always exit 0, because it only runs if [ $? -gt 0 ] returns success and sets $? to 0. The solution could again be to assign $? to a variable first, or (as shown) use mycommand || exit $? as there is no condition to overwrite $?.

Example of incorrect code:

mycommand
if [ $? -ne 0 ] && [ $? -ne 14 ]
then
  echo "Command failed"
fi

Example of correct code:

mycommand
ret=$?
if [ $ret -ne 0 ] && [ $ret -ne 14 ]
then
  echo "Command failed"
fi

Further Reading