Ответ 1
Используйте вертикальную панель (|
) для "или".
case "$C" in
"1")
do_this()
;;
"2" | "3")
do_what_you_are_supposed_to_do()
;;
*)
do_nothing()
;;
esac
Я ищу правильный синтаксис оператора switch с ошибками в Bash (в идеале без учета регистра). В PHP я бы запрограммировал его так:
switch($c) {
case 1:
do_this();
break;
case 2:
case 3:
do_what_you_are_supposed_to_do();
break;
default:
do_nothing();
}
Я хочу то же самое в Bash:
case "$C" in
"1")
do_this()
;;
"2")
"3")
do_what_you_are_supposed_to_do()
;;
*)
do_nothing();
;;
esac
Это как-то не работает: функция do_what_you_are_supposed_to_do()
должна быть запущена, когда $C равно 2 ИЛИ 3.
Используйте вертикальную панель (|
) для "или".
case "$C" in
"1")
do_this()
;;
"2" | "3")
do_what_you_are_supposed_to_do()
;;
*)
do_nothing()
;;
esac
Недавние версии bash
позволяют пропустить с помощью ;&
вместо ;;
:
они также позволяют возобновить проверку чеков, используя ;;&
.
for n in 4 14 24 34
do
echo -n "$n = "
case "$n" in
3? )
echo -n thirty-
;;& #resume (to find ?4 later )
"24" )
echo -n twenty-
;& #fallthru
"4" | ?4)
echo -n four
;;& # resume ( to find teen where needed )
"14" )
echo -n teen
esac
echo
done
вывод проб
4 = four
14 = fourteen
24 = twenty-four
34 = thirty-four
()
за именами функций в bash, если вы не хотите их определять.[23]
для соответствия 2
или 3
''
вместо ""
Если заключено в ""
, интерпретатор (бесполезно) пытается развернуть возможные переменные в значении перед сопоставлением.
case "$C" in
'1')
do_this
;;
[23])
do_what_you_are_supposed_to_do
;;
*)
do_nothing
;;
esac
Для нечувствительного к регистру соответствия вы можете использовать классы символов (например, [23]
):
case "$C" in
# will match C='Abra' and C='abra'
[Aa]'bra')
do_mysterious_things
;;
# will match all letter cases at any char like `abra`, `ABRA` or `AbRa`
[Aa][Bb][Rr][Aa])
do_wild_mysterious_things
;;
esac
Но abra
не ударил в любое время, потому что он будет соответствовать первому случаю.
При необходимости вы можете опустить ;;
в первом случае, чтобы продолжить тестирование матчей в следующих случаях. (;;
переходит на esac
)
Попробуйте следующее:
case $VAR in
normal)
echo "This doesn't do fallthrough"
;;
special)
echo -n "This does "
;&
fallthrough)
echo "fall-through"
;;
esac
Если значения целые, то вы можете использовать [2-3]
или [5,7,8]
для непостоянных значений.
#!/bin/bash
while [ $# -gt 0 ];
do
case $1 in
1)
echo "one"
;;
[2-3])
echo "two or three"
;;
[4-6])
echo "four to six"
;;
[7,9])
echo "seven or nine"
;;
*)
echo "others"
;;
esac
shift
done
Если значения строковые, вы можете использовать |
,
#!/bin/bash
while [ $# -gt 0 ];
do
case $1 in
"one")
echo "one"
;;
"two" | "three")
echo "two or three"
;;
*)
echo "others"
;;
esac
shift
done