Case 문은 알파벳 문자만 허용하나요?

Case 문은 알파벳 문자만 허용하나요?
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

숫자또는상징캐릭터입니다. 당신이 원하는 것 같습니다 :

  1. 영문자만( [[:alpha:]])
  2. 또는 알파벳 문자일 수도 있지만 라틴 문자만 가능합니다( a-z제안한 대로).
  3. 또는 발음 구별 부호 없이 라틴 알파벳의 알파벳 문자일 수도 있습니다.

로케일이 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. 여기에는 해당 로케일의 모든 알파벳 문자(대문자 및 소문자)가 포함됩니다.

관련 정보