ksh에 입력된 변수가 영숫자인지 확인하는 방법은 무엇입니까?

ksh에 입력된 변수가 영숫자인지 확인하는 방법은 무엇입니까?

AIX에서 ksh를 사용하고 있으며 변수(예: var1=sanySAN) 가 var2=SANYsa%$3영숫자인지 확인하고 싶습니다.

여기서는 var1대신 영숫자입니다 var2. [a-z][A-Z][0-9]or 을 사용할 수 있다는 것을 알고 있지만 [:alnum:] 방법을 모르겠습니다.

이렇게 확인해야 할까요?

if [[ var == [:alnum:]* ]] 
then 
    echo "yes"
else 
    echo "no"
fi 

여러 가지 방법을 시도했지만 실패했습니다.

답변1

앞쪽:

is_alnum() {
  case $1 in (*[![:alnum:]]*|"") false;; esac
}

그 다음에:

$ is_alnum 123 && echo yes
yes
$ is_alnum % || echo no
no

mksh위의 방법을 사용하여 실패한 유일한 쉘입니다.


또한 변수에 유효한 문자를 형성하지 않는 일련의 바이트가 포함된 경우 이 방법은 작동하지 않습니다.

yash유효한 유니코드 문자로만 작동하므로 오류를 보고하는 유일한 문자입니다.

$ is_alnum $'A\xe9B'
yash: cannot convert the argument `A�B' into a wide character stringyash: the argument is replaced with an empty string

고쳐 쓰다

mkshR56에 추가 및 수정된 문자 클래스R56c.

답변2

넌 할 수있어:

[[ $var = +([[:alnum:]]) ]]

이는 AT&T ksh 및 zsh기반 구현에서는 작동 ksh하지만 pdkshksh 기반 구현에서는 작동하지 않는 것 같습니다. 이는 zsh -o kshglob( zsh호출 시와 같이 ksh) 또는 bash -O extglob동일하게 적용됩니다.

+(...)ksh와일드카드 입니다하나 이상. [[:alnum:]]현재 로케일에서 영숫자로 간주되는 문자입니다(라틴 알파벳뿐만 아니라 모든 알파벳).

LC_ALL변수가 설정되지 않았다고 가정하고 영어 문자와 숫자로 제한하려면 다음을 수행하십시오.

LC_COLLATE=C; [[ $var = +([a-zA-Z0-9]) ]]

그렇지 않은 경우:

[[ $var = +([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]) ]]

이것:

LC_ALL=C; [[ $var = +([[:alnum:]]) ]]

문자의 의미가 바뀌더라도 작동해야 합니다. ASCII 숫자에 해당하는 바이트를 포함하는 문자(예: GB18030의 £는 81 30 84 35로 인코딩되며, 여기서 30은 ASCII 0이기도 함)에는 ASCII가 아닌 바이트(예: 81 84 £)도 포함되기 때문입니다. , 주어진 시스템의 모든 문자 세트는 모든 영어 영숫자 문자를 포함하는 이식 가능한 문자 세트의 문자 인코딩에 동의해야 합니다.

또한 UTF-8 로케일에서 ksh93u+(적어도)에는 현재 $var유효한 문자를 형성하지 않지만 ISO-8859-1 문자 세트의 숫자에 해당하는 바이트 시퀀스가 ​​포함된 경우 버그가 있습니다. 그들은 그러한 대우를 받을 것입니다 alnums. 예를 들어 $'A\xe9B'ISO-8859-1에서 0xe9는 é이므로 영숫자로 처리됩니다. (U+00E9는 이지만 éé의 UTF-8 인코딩은 0xe9가 아니라 0xc3 0xa9입니다.)

답변3

다음을 기반으로 한 몇 가지 아이디어 expr:

if expr "x$string" : '.*[^[:alnum:]]' >/dev/null;
then
  printf "%s is NOT alphanumeric\n" "$string"
else
  printf "%s is alphanumeric\n" "$string"
fi

printfover 는 임의의 문자열이므로 echo의도적인 사용 입니다. "$string"추가 정보여기. 또한 선행 "x"는 expr로 시작하는 항목으로 확장할 때 차단을 방지합니다. 의견을 통해 이 답변을 개선하는 데 도움을 준 Stéphane과 Sato에게 감사드립니다.$string-

답변4

모든 도움에 감사드립니다. 많은 시도 끝에 이 솔루션을 얻었습니다.

var=`echo "some-value" | tr -d "[:alnum:]"`
if [ "$var" == "" ]; then
echo " string has only alphanumerics"
else
echo "something other than alphanumerals  is there"
fi

관련 정보