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 " "

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


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

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é


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)


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

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/ .


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.