Процитировать дело?
В популярных императивных языках операторы switch обычно "проваливаются" на следующий уровень после сопоставления case-оператора.
Пример:
int a = 2;
switch(a)
{
case 1:
print "quick ";
case 2:
print "brown ";
case 3:
print "fox ";
break;
case 4:
print "jumped ";
}
напечатал бы "коричневую лисицу".
Однако тот же код в bash
A=2
case $A in
2)
echo "QUICK"
;&
2)
echo "BROWN"
;&
3)
echo "FOX"
;&
4)
echo "JUMPED"
;&
esac
печатает только "BROWN"
Как заставить оператор case в bash "провалиться" на остальные условия, такие как первый пример?
(изменить: bash версия 3.2.25, оператор & (из wiki) приводит к синтаксической ошибке)
работает:
test.sh:
#!/bin/bash
A=2
case $A in
1)
echo "QUICK"
;&
2)
echo "BROWN"
;&
3)
echo "FOX"
;&
esac
дает:
./test.sh: строка 6: синтаксическая ошибка около неожиданного токена ;' ./test.sh:
line 6:
; & '
Ответы
Ответ 1
Операторы ;&
и ;;&
были введены в bash 4.0, поэтому, если вы хотите придерживаться пятилетней версии bash, вам придется либо повторить код, либо использовать 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
или найти другой способ достижения фактической цели.
(На боковой ноте не используйте все имена переменных верхнего регистра. Вы рискуете перезаписать специальные переменные оболочки или переменные среды.)
Ответ 2
Попробуйте следующее:
case $VAR in
normal)
echo "This doesn't do fallthrough"
;;
fallthrough)
echo -n "This does "
;&
somethingelse)
echo "fall-through"
;;
esac
Ответ 3
Использование ;&
не очень переносимо, так как требует bash
(не ash
, dash
или real sh
) и требует как минимум bash
4.0 или новее (доступно не во всех системах).
Обход, который я считаю гораздо приятнее читать, чем много циклов if
is и изменить регистр 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