bash 사례 문장을 계단식으로 묶을 수 있습니까?


29

나는 이런 식으로하려고합니다.

case $level in
    3)
        echo "Level Three"

    2)
        echo "Level Two"

    1)
        echo "Level one"
        ;;
esac

여기서 $ level = 3이면 출력됩니다.

Level Three
Level Two
Level One

$ level = 1이면 출력 만됩니다

Level One

그러나 시도 할 syntax error near unexpected token ')'때을 포함하지 않았기 때문에 오류가 발생 합니다 ;;.

내가 아는 다른 모든 언어는 이것을 허용합니다 .bash에서 그것을 할 수있는 방법이 있습니까? "이제 다음과 같은 경우에 일치하는 것"을 의미하는 일종의 키워드?


2
당신이 알고있는 모든 언어가 이것을 허용한다면, C와 그 모방 자 이외의 언어를 배워야합니다. 경우에 대한 설명은 C의 역사적 설계 사고로,보다 원칙적인 언어로 살아 남았습니다.
Gilles 'SO- 악마 그만해'

답변:


42

폴 스루 동작을 얻으려면 ;&대신 사용해야 합니다 ;;.

#! /bin/bash
foo() {
    case "$1" in
        3)
            echo "Level Three"
            ;&
        2)
            echo "Level Two"
            ;&
        1)
            echo "Level One"
            ;;
        a)
            echo "Level a"
            ;&
        b)
            echo "Level b"
            ;&
        c)
            echo "Level c"
            ;;
    esac
}
echo 3:
foo 3
echo 2:
foo 2
echo a:
foo a
3:
Level Three
Level Two
Level one
2:
Level Two
Level one
a:
Level a
Level b
Level c

bash 문서 의 조건부 구성 섹션을 참조하십시오 .

다른 특수 마커는 ;;&입니다.

쉘이 다음 절 (있는 경우)에서 패턴을 테스트하고 성공적으로 일치하면 연관된 명령 목록을 실행합니다.

;; 더 이상 패턴이 테스트되지 않습니다.

#! /bin/bash

foo() {
    case "$1" in
        *3*)
            echo "Level Three"
            ;;&
        *2*)
            echo "Level Two"
            ;;&
        *1*)
            echo "Level One"
            ;;&
    esac
}

echo 12:
foo 12
echo 13:
foo 13
echo 23:
foo 23
12:
Level Two
Level One
13:
Level Three
Level One
23:
Level Three
Level Two

18
이식성 참고 : 구문은 POSIX가 아닙니다. 그것은에서 온다 ksh에서 사용할 수 있습니다 ksh, bash(2009 년 4.0 이후) 및 zsh(1997, 3.1.2 이후). ;;&bash 특정입니다.
Stéphane Chazelas

4
또한 참고 것을 zsh동등한 bash의가 ;;&있다 ;|(4.3.3, 2007 년 추가).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.