폴스 루로 케이스 전환?


193

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 일 때 함수 가 실행되어야합니다.


4
parens와 함께 호출 함수를 사용하지 마십시오 !!! 당신이 중 하나를 사용 bash는 함수를 정의 할 수 있기 때문에 function fname { echo "Inside fname"; return 0; }또는 fname() { echo "inside fname"; return 0; }이 함수 (고화질)처럼 보일 수있는 함수 호출에 괄호를 배치. 기능은 다음과 같은 다른 명령 줄 프로그램처럼 호출되어야한다 mv, cp, rsync, ls, cd에 fname이 너무 좋아 우리가 부르는 경우 ... 등 : fname $ARGS.
Charles Addis

do_nothing()SKIP 명세서가되어야합니까? 사용하십시오 :.
sjas

답변:


309

|"또는" 에는 세로 막대 ( )를 사용하십시오 .

case "$C" in
"1")
    do_this()
    ;;
"2" | "3")
    do_what_you_are_supposed_to_do()
    ;;
*)
    do_nothing()
    ;;
esac

30
또는이 간단한 경우에 캐릭터 클래스[23])
SiegeX

4
@Mischka-이 답변을 수락하지 않은 것 같습니다. 질문의 핵심 부분에 답변하지 않기 때문입니까? 폴 스루 로직은 do_what_you_are_supposed_to_do()"2"와 "3"을 모두 단일 사례로 축소 해도이 문제 를 해결하지 못 하기 전에 특수 처리를 수행해야하는 경우에 유용 합니다. 많은 사람들이이 답변이 도움이되었다는 것이 명백하기 때문에이 질문을보다 명확하게하기 위해 질문을 편집하는 것이 합리적인지 잘 모르겠습니다.
타이슨

1
@Tyson OP는 등록되지 않은 사용자이므로 답변을 수락하지 않았습니다. 프로그래머에 의해 일반적으로 이해되는 바와 같이, "폴 스루 (fall-through)"로직에 관해서, 질문 본문은 폴 스루 로직이 아니라 조건의 붕괴를 나타낸다 . (공지 사항의 사용 breakPHP 코드 인치)는이 날짜에서 답변의 많은 무효화 것, 질문, 또는 제목을 편집 해서는 안 아마 논리 가을-을 통해 제공하고 있습니다. 다른 사용자가 여러 번 수정하기 전까지는 대체 항목에 포함되지 않았지만 지금 다시 가져 오기에는 너무 늦었습니다.
user7412956

100

최신 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

1
이 예에서이 논리는 따르기가 어려웠습니다. 또한이 예제가 실제로 ;&와 의 차이점을 보여주지 않는다고 생각합니다 ;;&. 에서 "24"를 변경하고 ;;& # resume동일한 결과를 얻었으므로 여전히 ;&폴 스루를 사용할지 궁금합니다 .
wisbucky

1
그것은 복잡한 일에 대한 간단한 예이다 - 나는 변화 ?4[13]4좀 더 분명하게하고, 변경 사항 주요 변경하도록
Jasen

26
  • ()정의하지 않는 한 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 "${C,,}" in문자가 중요하지 않은 경우 C를 소문자로 변환 할 수도 있습니다
Sprinterfreak

1
를 생략하면 ;;어떻게됩니까? ;&전도 에 사용하지 않습니까?
HelloGoodbye

1
테스트를 계속 ;; 하려면 사용할 필요 가없는 경우 구문 오류가 발생합니다 ;;&.
Jasen

do_wild_mysterious_things내 하루를 만들어
Julien__

14

이 시도:

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

1
매우 유용한 팁입니다. 적어도 Bash 4.3.11. 나는 다른 사람들에게 그것을 시도하지 않았다.
Daniel

3
참고 : 이것은 여전히 ​​bash 3.2에서는 작동하지 않으며 macOS의 기본 bash입니다.
Danny Kirchmeier

13

값이 정수이면 연속 값이 아닌 값을 사용 [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

은 무엇인가 shift에 대한 말?
Milkncookiez

1
shiftCLI 인수 목록에서 첫 번째 인수를 제거합니다. 기본적으로이 루프의 모든 반복에서 항상 $1의 도움으로 CLI 인수 목록에서 각 인수를 가져옵니다 shift.
rashok
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.