case "$1" in
all)
echo "$1"
;;
[a-z][a-z][a-z][a-z][a-z][a-z])
echo "$1"
;;
*)
printf 'Invalid: %s\n' "$3"
exit 1
;;
esac
이 경우 허용되는 유일한 입력은 6자입니다. 4자 이상 6자 이상은 허용되지 않습니다.
여기서 하고 싶은 것은 숫자나 기호가 아닌 문자만 허용하고 길이에 제한을 두지 않는 것입니다.
올바른 구문은 무엇입니까? 감사해요
답변1
숫자또는상징캐릭터입니다. 당신이 원하는 것 같습니다 :
- 영문자만(
[[:alpha:]]
) - 또는 알파벳 문자일 수도 있지만 라틴 문자만 가능합니다(
a-z
제안한 대로). - 또는 발음 구별 부호 없이 라틴 알파벳의 알파벳 문자일 수도 있습니다.
로케일이 C/POSIX가 아닌 한 [a-z]
일치는 다소 무작위입니다 bash
(적어도 GNU 시스템에서는).
1의 경우 다음이 필요합니다.
die() {
printf >&2 '%s\n' "$1"
exit 1
}
case $string in
("") die "Can't be empty";;
(*[![:alpha:]]*) die "contains non-alphabetical characters";;
(*) echo OK
esac
all
, Stéphane
(라틴 알파벳), γράμμα
(그리스어 알파벳), письмо
(키릴 알파벳) 은 허용되지만 foo-bar
, 123
...은 허용되지 않습니다.
2는 까다로울 수 있습니다. 특히 발음 구별 부호 결합을 고려하려는 경우 더욱 그렇습니다.
3의 경우 모든 로케일에서 실행하려면 필수 문자를 지정해야 합니다.
ok=abcdefghijklmnopqstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
case
선언에 사용
(*[!$ok]*) die "contains characters not allowed";;
또는 문자 코드 포인트 기반 범위로 전환하여 zsh
항상 abcdefghijklmnopqstuvwxyz만 포함하거나 bash 4.3 이상을 사용할 수 있습니다.[a-zA-Z]
이 globasciiranges
옵션을 사용하면 동일한 동작이 수행됩니다.bash
.
답변2
허용되지 않는 문자를 찾고 발견된 경우 입력을 거부함으로써 표준 패턴 일치를 사용하여 이를 수행할 수 있습니다. 아니면 당신은 사용할 수 있습니다확장된 글로벌( extglob
) 또는 정규 표현식을 사용하고 전체 문자열이 다음으로 구성되어 있는지 명시적으로 확인합니다.예허용하다.
#/bin/bash
shopt -s extglob globasciiranges
case "$1" in *([a-zA-Z])) echo "case ok" ;; esac
[[ "$1" = *([a-zA-Z]) ]] && echo " [[ ok"
[[ "$1" =~ ^[a-zA-Z]*$ ]] && echo "rege ok"
globasciiranges
악센트 문자 일치를 방지 [a-z]
하지만 정규식 일치에서는 이를 준수하지 않습니다. 정규식을 사용하면 LC_COLLATE=C
일치하지 않도록 설정해야 합니다 .
이들 모두는 빈 문자열을 허용합니다. 이를 방지하려면 별표를 더하기 기호( *
to +
)로 변경하세요.
답변3
또는 이와 동등한 기능을 사용하는 경우 bash
스크립트 상단에 해당 줄을 포함하여 set -s extglob
확장 기능을 활성화하세요.와일드카드(정규 표현식의 한 형태) 그런 다음 명령문에서 case
선택기를 로 설정하고 +([[:alpha:]])
, 물론 명령문 자체 )
에서 원하는 내용을 로 설정합니다 case
.
alpha
여러 가지 중 하나캐릭터 클래스매뉴얼 페이지에 정의되어 있습니다 bash
. 여기에는 해당 로케일의 모든 알파벳 문자(대문자 및 소문자)가 포함됩니다.