SC2056
Joachim Ansorg edited this page Nov 12, 2021
·
2 revisions
You probably wanted && here
Problematic code:
if (( $1 != 0 || $1 != 3 ))
then
echo "$1 is not 0 or 3"
fiCorrect code:
if (( $1 != 0 && $1 != 3 ))
then
echo "$1 is not 0 or 3"
fiRationale:
This is not a bash issue, but a simple, common logical mistake applicable to all languages.
(( $1 != 0 || $1 != 3 )) is always true:
- If
$1 = 0then$1 != 3is true, so the statement is true. - If
$1 = 3then$1 != 0is true, so the statement is true. - If
$1 = 42then$1 != 0is true, so the statement is true.
(( $1 != 0 && $1 != 3 )) is true only when $1 is not 0 and not 3:
- If
$1 = 0, then$1 != 3is false, so the statement is false. - If
$1 = 3, then$1 != 0is false, so the statement is false. - If
$1 = 42, then both$1 != 0and$1 != 3is true, so the statement is true.
This statement is identical to ! (( $1 == 0 || $1 == 3 )), which also works correctly.
Exceptions
None.