하나의 Case 문에서 여러 조건이 일치할 수 있나요?

하나의 Case 문에서 여러 조건이 일치할 수 있나요?

나는 이와 같은 작업을 수행하고 싶습니다. 금요일에 출력은 일치하는 두 가지 조건입니다.

#!/bin/bash

#!/bin/bash
NOW=$(date +"%a")
case $NOW in
    Mon)
        echo "Mon";;
    Tue|Wed|Thu|Fri)
        echo "Tue|Wed|Thu|Fri";;
    Fri|Sat|Sun)
        echo "Fri|Sat|Sun";;
    *) ;;
esac

위 코드를 작성하면 금요일에 대한 유일한 출력은 다음과 같습니다.

화요일|수요일|목요일|금요일

금요일 예상 출력:

화요일|수요일|목요일|금요일
|토요일|일요일

제가 이해한 바에 따르면, 일반적인 상황에서는첫 번째 모드에 해당하는 명령만표현식과 일치하는 콘텐츠가 실행됩니다.

패턴과 일치하는 다른 명령을 실행할 수 있는 방법이 있나요?

편집 : 나는 찾고 있지 않습니다넘어지는 행동, 그러나 그것은 또한 알아 둘 가치가 있는 것입니다. 스틸드라이버님 감사합니다.

답변1

접속사를 사용할 수 있습니다 ;;&. 에서 man bash:

               Using ;;& in place of ;; causes the shell to test
the next pattern list in the statement, if any, and execute  any
associated  list on a successful match.

전임자. 주어진

$ cat myscript 
#!/bin/bash
NOW=$(date -d "$1" +"%a")
case $NOW in
    Mon)
        echo "Mon";;
    Tue|Wed|Thu|Fri)
        echo "Tue|Wed|Thu|Fri";;&
    Fri|Sat|Sun)
        echo "Fri|Sat|Sun";;
    *) ;;
esac

그 다음에

$ ./myscript thursday
Tue|Wed|Thu|Fri

$ ./myscript friday
Tue|Wed|Thu|Fri
Fri|Sat|Sun

$ ./myscript saturday
Fri|Sat|Sun

자세한 내용(다른 셸의 해당 내용 포함)은 다음을 참조하세요.

답변2

아니요, Case 문의 기본 구조는 일치하는 세그먼트 하나만 실행하는 것입니다. 실패를 제외하고는 거절합니다. 또한 모든 쉘이 아닌 일부 쉘에서만 작동하며 각 쉘에 특정한 구문이 있습니다. 실패한 Bash 구문은 ;;&. ksh 또는 zsh에서 사용 가능한 유일한 옵션은 ;&다음 테스트를 실행하지 않고 섹션을 직접 실행하는 것입니다(모든 경우에 대해 두 줄이 인쇄됩니다 Tue|Wed|Thu|Fri).

Case에 대한 유일한 옵션은 다음 두 줄로 분할하는 것입니다.

esac
case $now in

이렇게 (부탁드립니다! 환경 변수의 대문자를 유지해주세요):

#!/bin/bash
now=$(date +"%a")
case $now in
    Mon)
        echo "Mon";;
    Tue|Wed|Thu|Fri)
        echo "Tue|Wed|Thu|Fri";;
esac
case $now in
    Fri|Sat|Sun)
        echo "Fri|Sat|Sun";;
    *) ;;
esac

답변3

또 다른 옵션: 기능을 사용하세요.

$ cat tt
#!/bin/bash

mon()     { echo "  Mon"             ; }
tue_fri() { echo "  Tue|Wed|Thu|Fri" ; }
fri_sun() { echo "  Fri|Sat|Sun"     ; }

now=$(date +"%a")
[[ $1 != "" ]] && now=$1      # use for testing

case $now in
  Mon)         mon              ;;
  Tue|Wed|Thu) tue_fri          ;;
  Fri)         tue_fri; fri_sun ;;
  Sat|Sun)     fri_sun          ;;
  *)           echo "  ERROR"   ;;
esac

그리고 테스트

$ for f in Mon Tue Wed Thu Fri Sat Sun bla ;do echo "$f"; tt "$f"; done
Mon
  Mon
Tue
  Tue|Wed|Thu|Fri
Wed
  Tue|Wed|Thu|Fri
Thu
  Tue|Wed|Thu|Fri
Fri
  Tue|Wed|Thu|Fri
  Fri|Sat|Sun
Sat
  Fri|Sat|Sun
Sun
  Fri|Sat|Sun
bla
  ERROR

관련 정보