Case statement fallthrough?
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 1:
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.)
Solution 2:
Try this:
case $VAR in
normal)
echo "This doesn't do fallthrough"
;;
fallthrough)
echo -n "This does "
;&
somethingelse)
echo "fall-through"
;;
esac
Solution 3:
Using ;&
is not very portable, as it requires bash
(not ash
, dash
, or any other minimal sh
) and it requires at least bash
4.0 or newer (not available on all systems, e.g. macOS 10.14.6 still only offers bash 3.2.57).
A work around that I consider much nicer to read than a lot of if
's is loop and modify the case var:
#!/bin/sh
A=2
A_BAK=$A
while [ -n "$A" ]; do
case $A in
1)
echo "QUICK"
A=2
;;
2)
echo "BROWN"
A=3
;;
3)
echo "FOX"
A=4
;;
4)
echo "JUMPED"
A=""
;;
esac
done
A=$A_BAK
Here's a proof of concept: https://www.onlinegdb.com/0ngLPXXn8