Ermittelt den numerischen ASCII-Wert für ein Zeichen

10

Ich versuche, ein Shell-Skript zu schreiben, das nach einem ASCII-Zeichen im Bereich AZ oder az fragt und dessen äquivalenten numerischen Wert zurückgibt. Die Ausgabe könnte beispielsweise folgendermaßen aussehen:

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

Mein Versuch:

#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "
Host Post
quelle
Ich habe Ihre zweite Frage herausgeschnitten, da sie nichts damit zu tun hatte. Sie sollten es separat veröffentlichen (den Originaltext erhalten Sie hier )
Michael Mrozek
Ihr Beispiel funktioniert für mich. Können Sie eine Ausgabe einfügen, die zeigt, was passiert, und den Fehler beschreiben? Macht echo -n Awas du erwartest? Wenn nicht, versuchen Sie es printfstattdessen. Macht od -iwas du erwartest? Wenn nicht, versuchen Sie es od -t d1.
Mikel
1
Ich habe versucht, od -t d1 hat super funktioniert ... Danke
Host Post

Antworten:

8

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

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

Perl, Umgang mit UTF-8 in einem UTF-8-Gebietsschema: perl -C255 -e 'print ord($ARGV[0])' œ

Gilles 'SO - hör auf böse zu sein'
quelle
8

POSIX:

$ printf %d\\n \'a
97

Es funktioniert auch mit Nicht-ASCII-Zeichen in Bash 4.0 und höher und in zsh:

$ printf %x\\n \'あ
3042

Sie können auch recode ..dumphexadezimale Codepunkte anzeigen:

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

0061   a     latin small letter a
3042   a5    hiragana letter a
Lri
quelle
2
Um es ein bisschen weniger "dunkel" zu machen, kann man auch zB A=a ; printf '%d\n' "'$A'"und auf ksh so etwas wie A=a; integer N=$(("'$A'")); print $N(print oder printf wird nicht benötigt) verwenden.
Jelmd
3

Vielleicht:

#!/bin/bash

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

Prost

D4RIO
quelle
Ich würde nur awk verwenden, anstatt nawk. Dies ist ziemlich Standard für jede awk-Version.
Asoundmove
Bearbeitet, ist meine Gewohnheit, 'nawk' zu verwenden, da ich nicht bei der Arbeit awk habe
D4RIO
Ja, Ihre Lösung hat auch bei mir funktioniert. Danke
Host Post
1

Eine ungerade Lösung, bisher nur Bash und nur Kleinbuchstaben. zist das gesuchte Zeichen, hier sals Suche. i=97weil ascii (a) = 97. Der Rest ist offensichtlich.

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

Sie können es natürlich in eine einzelne Zeile setzen. Hier sind einige Semikolons: ;;;;;(sollte ausreichen)

Benutzer unbekannt
quelle
Ich habe den obigen Code getestet. Aber es hat bei mir nicht funktioniert. Ich habe die Meldung "i + = 1" wurde nicht gefunden!
Host Post
Dies funktioniert in Bash. Möglicherweise benötigen Sie stattdessen i = $ ((i + 1)).
Benutzer unbekannt
In einer Zeile und mit dem Lesen einer Taste von der Tastatur:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
Erik
0

Versuchen Sie, od -t d1wenn Sie es haben. Die anderen Ausgabeformate sind ziemlich seltsam.

Sie brauchen auch keinen Kopf und Schnitt, zum Beispiel:

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

Wenn Sie nur ein Programm möchten, das dies tut, und Sie dies nicht als Übung tun, gibt es ein Programm namens ascii, das dies tut. Ihre Distribution bietet es möglicherweise bereits als Paket an, wenn Sie es nicht unter http://www.catb.org/~esr/ascii/ erhalten .

Bahamat
quelle
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
quelle