ottenere il valore numerico ASCII per un carattere


10

Sto provando a scrivere uno script di shell che richiede un carattere ASCII nell'intervallo AZ o az e restituisce il suo valore numerico equivalente. Ad esempio, l'output potrebbe essere simile al seguente:

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

Il mio tentativo:

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

Ho eliminato la tua seconda domanda poiché non era correlata; dovresti pubblicarlo separatamente (puoi ottenere il testo originale qui )
Michael Mrozek

Il tuo esempio funziona per me. Riesci a incollare l'output che mostra cosa succede e descrivere qual è l'errore? Fa echo -n Aquello che ti aspetti? In caso contrario, prova printfinvece. Fa od -iquello che ti aspetti? Altrimenti, prova od -t d1.
Mikel,

1
Ho provato od -t d1 ha funzionato alla grande ... Grazie
Host Post

Risposte:



8

POSIX:

$ printf %d\\n \'a
97

Funziona anche con caratteri non ASCII in bash 4.0 e versioni successive e in zsh:

$ printf %x\\n \'あ
3042

Puoi anche usare recode ..dumpper vedere punti di codice esadecimali:

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

0061   a     latin small letter a
3042   a5    hiragana letter a

2
Per renderlo un po 'meno "oscuro", si può anche usare eg A=a ; printf '%d\n' "'$A'"e su ksh qualcosa di simile A=a; integer N=$(("'$A'")); print $N(non è necessario stampare o stampare).
jelmd,

3

Può essere:

#!/bin/bash

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

Saluti


Vorrei solo usare awk, piuttosto che nawk. Questo è abbastanza standard per qualsiasi versione di Awk.
asoundmove,

A cura, ho l'abitudine di usare 'nawk' dal momento che non mi sono
svegliato

sì, la tua soluzione ha funzionato anche per me .. grazie
Host Post

1

Una soluzione senza odori, solo bash e solo minuscola, finora. zè il personaggio cercato, qui scome ricerca. i=97perché ascii (a) = 97. Il resto è ovvio.

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

Puoi metterlo in una sola riga ovviamente. Ecco alcuni punti e virgola: ;;;;;(dovrebbe essere sufficiente)


Ho testato il codice sopra .. ma non ha funzionato per me .. Ho ricevuto un messaggio che dice "i + = 1" non è stato trovato!
Host Post

Questo funziona in bash. Potrebbe essere necessario invece i = $ ((i + 1)).
utente sconosciuto

In una riga e con la lettura di un tasto dalla tastiera:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
erik

0

Prova od -t d1se ce l'hai. Gli altri formati di output sono piuttosto strani.

Inoltre non hai bisogno di testa e taglio, ad esempio:

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

0

Se vuoi solo un programma che fa questo e non lo stai facendo come esercizio, allora c'è un programma chiamato asciiche lo fa. La tua distribuzione potrebbe già offrirlo come pacchetto, se non lo ottieni da 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.