금요일에 다음과 같은 두 조건이 일치하는 출력이 나오는 것과 같은 작업을 수행하고 싶습니다.
#!/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 문의 기본 구조는 일치하는 세그먼트 하나만 실행된다는 것입니다. 당신이 거부하는 추락을 제외하고. 또한 전체가 아닌 일부 셸에서만 작동하며 각 셸에 특정한 구문이 있습니다. fall-through를 위한 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