Issue
In popular imperative languages, switch statements generally "fall through" to the next level once a case statement has been matched.
Example:
int a = 2;
switch(a)
{
case 1:
print "quick ";
case 2:
print "brown ";
case 3:
print "fox ";
break;
case 4:
print "jumped ";
}
would print "brown fox".
However the same code in bash
A=2
case $A in
2)
echo "QUICK"
;&
2)
echo "BROWN"
;&
3)
echo "FOX"
;&
4)
echo "JUMPED"
;&
esac
only prints "BROWN"
How do I make the case statement in bash "fall through" to the remaining conditions like the first example?
(edit: Bash version 3.2.25, the ;& statement (from wiki) results in a syntax error)
running:
test.sh:
#!/bin/bash
A=2
case $A in
1)
echo "QUICK"
;&
2)
echo "BROWN"
;&
3)
echo "FOX"
;&
esac
Gives:
./test.sh: line 6: syntax error near unexpected token
;' ./test.sh:
;&'
line 6:
Solution
The ;&
and ;;&
operators were introduced in bash 4.0, so if you want to stick with a five year old version of bash, you'll either have to repeat code, or use if
s.
if (( a == 1)); then echo quick; fi
if (( a > 0 && a <= 2)); then echo brown; fi
if (( a > 0 && a <= 3)); then echo fox; fi
if (( a == 4)); then echo jumped; fi
or find some other way to achieve the actual goal.
(On a side note, don't use all uppercase variable names. You risk overwriting special shell variables or environment variables.)
Answered By - geirha Answer Checked By - Terry (WPSolving Volunteer)