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
고쳐 쓰다
mksh
R56에 추가 및 수정된 문자 클래스R56c.
답변2
넌 할 수있어:
[[ $var = +([[:alnum:]]) ]]
이는 AT&T ksh 및 zsh
기반 구현에서는 작동 ksh
하지만 pdksh
ksh 기반 구현에서는 작동하지 않는 것 같습니다. 이는 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
printf
over 는 임의의 문자열이므로 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