obtener un valor ASCII numérico para un personaje


10

Estoy tratando de escribir un script de shell que pide un carácter ASCII en el rango AZ o az y devuelve su valor numérico equivalente. Por ejemplo, el resultado podría tener el siguiente aspecto:

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

Mi intento:

#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "

Edité su segunda pregunta ya que no estaba relacionada; debe publicarlo por separado (puede obtener el texto original aquí )
Michael Mrozek

Tu ejemplo me funciona. ¿Puedes pegar la salida que muestra lo que sucede y describir cuál es el error? ¿Hace echo -n Alo que esperas? Si no, intente en su printflugar. ¿Hace od -ilo que esperas? Si no, inténtalo od -t d1.
Mikel

1
Probé d1 -t desde trabajó grandes ... Gracias
Anfitrión Mensaje

Respuestas:


8

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

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

Perl, haciendo frente a UTF-8 si está en un entorno local UTF-8: perl -C255 -e 'print ord($ARGV[0])' œ


8

POSIX:

$ printf %d\\n \'a
97

También funciona con caracteres no ASCII en bash 4.0 y posterior y en zsh:

$ printf %x\\n \'あ
3042

También puede usar recode ..dumppara ver puntos de código hexadecimales:

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

0061   a     latin small letter a
3042   a5    hiragana letter a

2
Para hacerlo un poco menos "oscuro", también se puede usar, por ejemplo, A=a ; printf '%d\n' "'$A'"y en ksh algo como A=a; integer N=$(("'$A'")); print $N(no se necesita print o printf).
jelmd

3

Tal vez:

#!/bin/bash

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

Salud


Simplemente usaría awk, en lugar de nawk. Esto es bastante estándar para cualquier versión awk.
asoundmove

Editado, es mi costumbre de usar 'nawk' ya que no he trabajado en el trabajo
D4RIO

Sí, su solución funcionó para mí también .. gracias
Anfitrión mensaje

1

Una solución sin od, solo bash, y solo minúsculas, hasta ahora. zes el personaje buscado, aquí scomo búsqueda. i=97porque ascii (a) = 97. El resto es obvio.

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

Puede ponerlo en una sola línea, por supuesto. Aquí hay algunos punto y coma: ;;;;;(debería ser suficiente)


Probé el código anterior ... pero no funcionó para mí ... ¡Recibí un mensaje que decía que "i + = 1" no se encuentra!
Anfitrión Post

Esto funciona en bash. Es posible que necesite i = $ ((i + 1)) en su lugar.
Usuario desconocido

En una línea y con la lectura de una tecla del teclado:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
erik

0

Pruébalo od -t d1si lo tienes. Los otros formatos de salida son bastante raros.

Tampoco necesita cabeza y corte, por ejemplo:

printf "A" | od -t d1 | read addr num && echo $num

0

Si solo desea un programa que haga esto y no lo está haciendo como ejercicio, entonces hay un programa llamado asciique hace esto. Su distribución ya puede ofrecerla como un paquete, si no la obtiene de 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.