변수 인수가 테스트 표현식과 일치하지 않는 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 extglob
zsh
set -o kshglob
zsh
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)