Bash: Case 문이 주어진 문자열과 일치하지 않습니다.

Bash: Case 문이 주어진 문자열과 일치하지 않습니다.

변수 인수가 테스트 표현식과 일치하지 않는 Case 문을 작성하려고 합니다.

다시 말해서:

case $db in
      [Some Code Here])
          echo "Not a valid database type"
          exit 1
          ;;
esac

$db는 해야 한다오직값은 "mssql" 또는 "postgres"입니다. 그렇지 않으면 스크립트가 종료되어야 합니다.

사례 진술에서 이를 어떻게 수행합니까?

답변1

이렇게 하면 됩니다(이것은 표준 구문이므로 설치할 sh필요도 없습니다 ).bash

case $db in
  (mssql | postgres) ;; # OK
  (*)
    echo >&2 "Not a valid database type"
    exit 1
    ;;
esac

ksh또는 이후 (또는 이후 에 선호할 수 있는 자체 부정 및 대체 연산자가 있지만) 다음을 수행할 수 bash있습니다 .shopt -s extglobzshset -o kshglobzsh

case $db in
  (!(mssql|postgres))
    echo >&2 "Not a valid database type"
    exit 1
    ;;
esac

그러나 보다 일반적으로 입력 유효성 검사의 경우 허용하고 싶지 않은 모든 항목을 일치시키려는 것보다 허용한 항목을 일치시키는 것이 더 좋습니다. 왜냐하면 후자는 일반적인 경우에 종종 어렵고 위험하며(더 안전함) 따라서 더 신뢰할 수 있기 때문입니다. 충분히 거부하기보다는 너무 많이 거부함으로써 후자를 수행하십시오).

ksh88 및 ksh93의 이전 버전에서는 주의하세요.

케이스 $db in
  (@(mssql|postgres)) ;; # 확인
  (*)
    echo >&2 "유효한 데이터베이스 유형이 아닙니다."
    1번출구
    ;;
이삭

즉, Case 문에서 분리된 두 패턴 @(a|b)대신 교대 패턴 연산자를 사용하면 리터럴(Bourne 쉘에서 상속된 오류 기능)을 포함하는 것을 거부하지 않습니다.|$db@(mssql|postgres)

관련 정보