Programing

폴스 루로 케이스 전환?

crosscheck 2020. 5. 24. 12:53
반응형

폴스 루로 케이스 전환?


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" | ?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
  • 정적 문자열의 경우는로 묶어야합니다 ''대신""

If enclosed in "", the interpreter (needlessly) tries to expand possible variables in the value before matching.

case "$C" in
'1')
    do_this
    ;;
[23])
    do_what_you_are_supposed_to_do
    ;;
*)
    do_nothing
    ;;
esac

For case insensitive matching, you can use character classes (like [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

But abra didn't hit anytime because it will be matched by the first case.

If needed, you can omit ;; in the first case to continue testing for matches in following cases too. (;; jumps to esac)


Try this:

case $VAR in
normal)
    echo "This doesn't do fallthrough"
    ;;
special)
    echo -n "This does "
    ;&
fallthrough)
    echo "fall-through"
    ;;
esac

If the values are integer then you can use [2-3] or you can use [5,7,8] for non continuous values.

#!/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

If the values are string then you can use |.

#!/bin/bash
while [ $# -gt 0 ];
do
    case $1 in
    "one")
        echo "one"
        ;;
    "two" | "three")
        echo "two or three"
        ;;
    *)
        echo "others"
        ;;
    esac
    shift
done

참고URL : https://stackoverflow.com/questions/5562253/switch-case-with-fallthrough

반응형