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 " "
text-processing
scripting
od
Poste d'hôte
la source
la source
echo -n A
ce que vous attendez? Sinon, essayez à laprintf
place. Faitod -i
ce que vous attendez? Sinon, essayezod -t d1
.Réponses:
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])' œ
la source
POSIX:
Il fonctionne également avec des caractères non ASCII dans bash 4.0 et versions ultérieures et dans zsh:
Vous pouvez également utiliser
recode ..dump
pour voir les points de code hexadécimaux:la source
A=a ; printf '%d\n' "'$A'"
et sur ksh quelque chose commeA=a; integer N=$(("'$A'")); print $N
(print ou printf n'est pas nécessaire).Peut être:
À votre santé
la source
Une solution sans odeur, juste bash, et juste en minuscules, jusqu'à présent.
z
est le caractère recherché, icis
comme recherche.i=97
car ascii (a) = 97. Le reste est évident.Vous pouvez le mettre sur une seule ligne bien sûr. Voici quelques points-virgules:
;;;;;
(devrait suffire)la source
read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
Essayez
od -t d1
si 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:
la source
Si vous voulez juste un programme qui fait cela et que vous ne le faites pas comme un exercice, il existe un programme appelé
ascii
qui fait cela. Votre distribution peut déjà l'offrir sous forme de package, sinon l'obtenir sur http://www.catb.org/~esr/ascii/ .la source
la source