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

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

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


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)


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

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 .


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.