POSIX: printf a | od -A n -t d1
Perl: perl -e 'print ord($ARGV[0])' a
Perl, lidando com UTF-8 se estiver em uma localidade UTF-8: perl -C255 -e 'print ord($ARGV[0])' œ
Estou tentando escrever um script de shell que solicita um caractere ASCII no intervalo A-Z ou a-z e retorna seu valor numérico equivalente. Por exemplo, a saída pode se parecer com o seguinte:
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 " "
POSIX: printf a | od -A n -t d1
Perl: perl -e 'print ord($ARGV[0])' a
Perl, lidando com UTF-8 se estiver em uma localidade UTF-8: perl -C255 -e 'print ord($ARGV[0])' œ
POSIX:
$ printf %d\n \'a
97
Também funciona com caracteres não-ASCII no bash 4.0 e posterior e no zsh:
$ printf %x\n \'あ
3042
Você também pode usar recode ..dump
para ver os pontos de código hexadecimais:
$ printf aあ|recode ..dump
UCS2 Mne Description
0061 a latin small letter a
3042 a5 hiragana letter a
Talvez:
#!/bin/bash
echo -n "Enter a letter:"
read A
echo ${A}|od -t d1|awk '{printf "%s",$2}';echo
Felicidades
Uma solução sem od, apenas bash, e apenas minúscula, até agora. z
é o caractere pesquisado, aqui s
como pesquisa. i=97
porque ascii (a) = 97. O resto é óbvio.
z=s
i=97
for c in {a..z}
do
[ "$c" = "$z" ] && echo $i && break || ((i+=1))
done
Você pode colocá-lo em uma única linha de curso. Aqui estão alguns semicolons: ;;;;;
(deve ser suficiente)
Experimente od -t d1
se você tiver. Os outros formatos de saída são bem estranhos.
Você também não precisa de cabeça e corte, por exemplo:
printf "A" | od -t d1 | read addr num && echo $num
# Get one character per loop, until the user presses <Enter>
while true ; do
read -n 1 c
(( ${#c} == 0 )) && break # Exit the loop. Input length is 0
# ie. The user has pressed Enter
#
if [ \( ! "$c" \< "a" -a ! "$c" \> "z" \) \
-o \( ! "$c" \< "A" -a ! "$c" \> "Z" \) ]
then
val=($(ascii -s $c)) # build an array of ascii info for this char
echo " ... The decimal value of $c is: ${val[1]}"
else
echo -n $'\r \r' # overwrite the invalid character
fi
done
Tags text-processing scripting od