obtenir une valeur ASCII numérique pour un caractère

10

J'essaie d'écrire un script shell qui demande un caractère ASCII dans la plage AZ ou az et renvoie sa valeur numérique équivalente. Par exemple, la sortie peut ressembler à ceci:

scarlet$ Please type a character between A and Z or between a and z:
scarlet$ A       
scarlet$ The decimal value of A is: 65 

Ma tentative:

#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "
Poste d'hôte
la source
J'ai modifié votre deuxième question car elle n'était pas liée; vous devez le poster séparément (vous pouvez obtenir le texte original ici )
Michael Mrozek
Votre exemple fonctionne pour moi. Pouvez-vous coller une sortie montrant ce qui se passe et décrire quelle est l'erreur? Fait echo -n Ace que vous attendez? Sinon, essayez à la printfplace. Fait od -ice que vous attendez? Sinon, essayez od -t d1.
Mikel
1
J'ai essayé od -t d1 a très bien fonctionné ... Merci
Host Post

Réponses:

8

POSIX: printf a | od -A n -t d1

Perl: perl -e 'print ord($ARGV[0])' a

Perl, faire face à UTF-8 si dans un environnement local UTF-8: perl -C255 -e 'print ord($ARGV[0])' œ

Gilles 'SO- arrête d'être méchant'
la source
8

POSIX:

$ printf %d\\n \'a
97

Il fonctionne également avec des caractères non ASCII dans bash 4.0 et versions ultérieures et dans zsh:

$ printf %x\\n \'あ
3042

Vous pouvez également utiliser recode ..dumppour voir les points de code hexadécimaux:

$ printf aあ|recode ..dump
UCS2   Mne   Description

0061   a     latin small letter a
3042   a5    hiragana letter a
Lri
la source
2
Pour le rendre un peu moins "obscur", on peut aussi utiliser par exemple A=a ; printf '%d\n' "'$A'"et sur ksh quelque chose comme A=a; integer N=$(("'$A'")); print $N(print ou printf n'est pas nécessaire).
jelmd
3

Peut être:

#!/bin/bash

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

À votre santé

D4RIO
la source
Je voudrais simplement utiliser awk, plutôt que nawk. C'est assez standard pour toute version awk.
asoundmove
Modifié, j'ai l'habitude d'utiliser 'nawk' car je n'ai pas de travail au travail
D4RIO
oui, votre solution a fonctionné pour moi aussi .. merci
Host Post
1

Une solution sans odeur, juste bash, et juste en minuscules, jusqu'à présent. zest le caractère recherché, ici scomme recherche. i=97car ascii (a) = 97. Le reste est évident.

z=s 
i=97
for c in {a..z}
do 
    [ "$c" = "$z" ] && echo $i && break || ((i+=1))
done

Vous pouvez le mettre sur une seule ligne bien sûr. Voici quelques points-virgules: ;;;;;(devrait suffire)

Utilisateur inconnu
la source
J'ai testé le code ci-dessus .. mais cela n'a pas fonctionné pour moi .. J'ai reçu un message disant "i + = 1" est introuvable!
Post hôte
Cela fonctionne en bash. Vous aurez peut-être besoin de i = $ ((i + 1)) à la place.
utilisateur inconnu
En une ligne et en lisant une touche du clavier:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
erik
0

Essayez od -t d1si vous l'avez. Les autres formats de sortie sont assez étranges.

Vous n'avez pas non plus besoin de tête et de coupe, par exemple:

printf "A" | od -t d1 | read addr num && echo $num
Mikel
la source
0

Si vous voulez juste un programme qui fait cela et que vous ne le faites pas comme un exercice, il existe un programme appelé asciiqui fait cela. Votre distribution peut déjà l'offrir sous forme de package, sinon l'obtenir sur http://www.catb.org/~esr/ascii/ .

bahamat
la source
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
Peter.O
la source