obtém um valor ASCII numérico para um caractere

8

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 " "
    
por Host Post 18.03.2011 / 03:10

7 respostas

8

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])' œ

    
por 18.03.2011 / 22:32
4

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
    
por 14.06.2014 / 22:00
3

Talvez:

#!/bin/bash

echo -n "Enter a letter:"
read A
echo ${A}|od -t d1|awk '{printf "%s",$2}';echo

Felicidades

    
por 18.03.2011 / 04:06
1

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)

    
por 18.03.2011 / 08:11
0

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
    
por 18.03.2011 / 03:45
0

Se você quer apenas um programa que faz isso e não está fazendo isso como um exercício, existe um programa chamado ascii que faz isso. Sua distro pode oferecê-lo como um pacote já, se não conseguir o link .

    
por 20.03.2011 / 03:55
0
# 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
    
por 19.03.2011 / 22:35