Eu estou tentando escrever um script de shell que solicita um caractere ASCII no intervalo AZ ou az e retorna seu valor numérico equivalente. Por exemplo, a saída pode ter a seguinte aparência:
scarlet$ Please type a character between A and Z or between a and z:
scarlet$ A
scarlet$ The decimal value of A is: 65
Minha tentativa:
#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "
text-processing
scripting
od
Postagem do Anfitrião
fonte
fonte
echo -n A
que você espera? Caso contrário, tenteprintf
. Faz ood -i
que você espera? Caso contrário, tenteod -t d1
.Respostas:
POSIX:
printf a | od -A n -t d1
Perl:
perl -e 'print ord($ARGV[0])' a
Perl, lidando com UTF-8 se estiver em um código de idioma UTF-8:
perl -C255 -e 'print ord($ARGV[0])' œ
fonte
POSIX:
Também funciona com caracteres não ASCII no bash 4.0 e posterior e no zsh:
Você também pode usar
recode ..dump
para ver pontos de código hexadecimal:fonte
A=a ; printf '%d\n' "'$A'"
e no ksh algo comoA=a; integer N=$(("'$A'")); print $N
(print ou printf não é necessário).Talvez:
Felicidades
fonte
Uma solução sem od, apenas bash e minúscula, até agora.
z
é o caractere pesquisado, aquis
como pesquisa.i=97
porque ascii (a) = 97. O resto é óbvio.Você pode colocá-lo em uma única linha, é claro. Aqui estão alguns ponto e vírgula:
;;;;;
(deve ser suficiente)fonte
read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
Tente
od -t d1
se você tiver. Os outros formatos de saída são bastante estranhos.Você também não precisa de cabeça e corte, por exemplo:
fonte
Se você quer apenas um programa que faça isso e não estiver fazendo isso como exercício, existe um programa chamado
ascii
que faz isso. Sua distribuição já pode oferecê-lo como um pacote, se não obtê-lo em http://www.catb.org/~esr/ascii/ .fonte
fonte