Bash에서 대소 문자가없는 switch 문의 올바른 구문을 찾고 있습니다 (이상적으로 대소 문자를 구분하지 않음). 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" | [13]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