Como verificar se uma variável digitada é alfanumérica ou não em ksh?

1

Estou usando o ksh no AIX e quero verificar se uma variável, por exemplo, var1=sanySAN , var2=SANYsa%$3 é alfanumérica ou não.

Aqui, var1 é alfanumérico e var2 não é. Eu sei que posso usar [a-z][A-Z][0-9] ou [:alnum:] , mas não sei como.

Devo checar assim?

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

Eu tentei muitas maneiras, mas elas falharam.

    
por santhosh 16.11.2016 / 11:02

4 respostas

1

POSIXLY:

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

Então:

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

mksh é o único shell que falhou com a abordagem acima.

Observe também que, se a variável contiver seqüências de bytes que não formam caracteres válidos, essa abordagem não funcionará.

yash só funciona com caracteres unicode válidos, por isso é o único erro de relatórios:

$ is_alnum $'A\xe9B'
yash: cannot convert the argument 'A�B' into a wide character stringyash: the argument is replaced with an empty string
    
por 16.11.2016 / 11:19
1

Alguma ideia baseada em expr :

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

Observe que o uso de printf over echo é intencional, pois "$string" é uma string arbitrária. Mais informações aqui . Além disso, o "x" no início impede que expr engasse se $string se expandir para algo que comece com - . Meus agradecimentos a Stéphane e Sato, que ajudaram a refinar essa resposta com seus comentários.

    
por 16.11.2016 / 14:54
0

Obrigado por toda a ajuda .. depois de muitas tentativas eu consegui esta solução funcionando.

var='echo "some-value" | tr -d "[:alnum:]"'
if [ "$var" == "" ]; then
echo " string has only alphanumerics"
else
echo "something other than alphanumerals  is there"
fi
    
por 16.11.2016 / 16:44
0

Você pode fazer:

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

Isso funcionaria nas implementações AT & T ksh e zsh de ksh , mas aparentemente não em pdksh -based. Isso funciona em zsh -o kshglob (como quando zsh é invocado como ksh ) ou bash -O extglob também.

+(...) é ksh curinga para um ou mais . [[:alnum:]] é qualquer caractere considerado alfanumérico na localidade atual (em qualquer alfabeto, não necessariamente apenas no alfabeto latino).

Se você quiser limitar as letras e os dígitos em inglês, supondo que a variável LC_ALL não esteja definida, você pode fazer:

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

Se não:

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

Isto:

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

Também deve funcionar, embora mude o significado dos caracteres. Porque caracteres que conteriam bytes que de outra forma correspondem a alvos ASCII (como por exemplo £ em GB18030 que é codificado como 81 30 84 35 onde 30 também é ASCII 0) também conteriam bytes que não estão em ASCII (como 81 84 para £), e todos os conjuntos de caracteres em um determinado sistema têm que concordar com a codificação dos caracteres no conjunto de caracteres portátil que inclui todos os alfanuméricos em inglês.

Observe também que, nas localidades UTF-8, ksh93u + (pelo menos) tem um erro no momento em que $var contém sequências de bytes que não formam caracteres válidos, mas esses bytes correspondem a alnums na ISO-8859 -1 conjunto de caracteres, então eles seriam considerados como alnums . Por exemplo, $'A\xe9B' seria considerado alfanumérico porque 0xe9 é é em ISO-8859-1. (U + 00E9 é é , mas a codificação UTF-8 de é é 0xc3 0xa9, não 0xe9).

    
por 16.11.2016 / 16:45