uzyskać numeryczną wartość ASCII dla znaku

10

Próbuję napisać skrypt powłoki, który prosi o znak ASCII z zakresu AZ lub az i zwraca jego równoważną wartość liczbową. Na przykład dane wyjściowe mogą wyglądać następująco:

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

Moja próba:

#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "
Post hosta
źródło
Zredagowałem twoje drugie pytanie, ponieważ nie było ze sobą powiązane; należy pisać osobno (można dostać oryginalny tekst tutaj )
Michał Mrozek
Twój przykład działa dla mnie. Czy możesz wkleić dane wyjściowe pokazujące, co się dzieje i opisać, na czym polega błąd? Czy echo -n Arobisz to, czego oczekujesz? Jeśli nie, spróbuj printfzamiast tego. Czy od -irobisz to, czego oczekujesz? Jeśli nie, spróbuj od -t d1.
Mikel
1
Próbowałem od -t d1 działało świetnie ... Dzięki
Host Post

Odpowiedzi:

8

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

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

Perl, radzenie sobie z UTF-8, jeśli w ustawieniach regionalnych UTF-8: perl -C255 -e 'print ord($ARGV[0])' œ

Gilles „SO- przestań być zły”
źródło
8

POSIX:

$ printf %d\\n \'a
97

Działa również ze znakami spoza ASCII w wersji bash 4.0 i nowszych oraz w zsh:

$ printf %x\\n \'あ
3042

Możesz także użyć, recode ..dumpaby zobaczyć szesnastkowe punkty kodowe:

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

0061   a     latin small letter a
3042   a5    hiragana letter a
Lri
źródło
2
Aby uczynić to trochę mniej „niejasnym”, można również użyć np. A=a ; printf '%d\n' "'$A'"I na ksh czegoś takiego A=a; integer N=$(("'$A'")); print $N(print lub printf nie jest potrzebne).
jelmd,
3

Może:

#!/bin/bash

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

Twoje zdrowie

D4RIO
źródło
Po prostu użyłbym awk zamiast nawk. Jest to dość standardowe w każdej wersji awk.
asoundmove 18.03.11
Pod redakcją mam zwyczaj używania „nawk”, ponieważ nie
budzę się
tak, twoje rozwiązanie również dla mnie zadziałało. dzięki
Host Post
1

Do tej pory bezzasadne rozwiązanie, po prostu bash i tylko małe litery. zjest szukaną postacią, tutaj sjako wyszukiwanie. i=97ponieważ ascii (a) = 97. Reszta jest oczywista.

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

Oczywiście możesz umieścić go w jednej linii. Oto kilka semmicolonów: ;;;;;(powinno wystarczyć)

nieznany użytkownik
źródło
Przetestowałem powyższy kod .. ale to nie działało dla mnie .. Otrzymałem komunikat, że „i + = 1” nie znaleziono!
Host Post
To działa w trybie bash. Zamiast tego możesz potrzebować i = $ ((i + 1)).
użytkownik nieznany
W jednym wierszu i po odczytaniu klawisza z klawiatury:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
erik
0

Spróbuj, od -t d1jeśli masz. Inne formaty wyjściowe są dość dziwne.

Nie potrzebujesz też głowy i cięcia, na przykład:

printf "A" | od -t d1 | read addr num && echo $num
Mikel
źródło
0

Jeśli chcesz tylko program, który to robi, a nie robisz tego jako ćwiczenie, istnieje program o asciitakiej nazwie . Twoja dystrybucja może już oferować go jako pakiet, jeśli nie, pobierz go z http://www.catb.org/~esr/ascii/ .

bahamat
źródło
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
źródło