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 " "
text-processing
scripting
od
Post hosta
źródło
źródło
echo -n A
robisz to, czego oczekujesz? Jeśli nie, spróbujprintf
zamiast tego. Czyod -i
robisz to, czego oczekujesz? Jeśli nie, spróbujod -t d1
.Odpowiedzi:
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])' œ
źródło
POSIX:
Działa również ze znakami spoza ASCII w wersji bash 4.0 i nowszych oraz w zsh:
Możesz także użyć,
recode ..dump
aby zobaczyć szesnastkowe punkty kodowe:źródło
A=a ; printf '%d\n' "'$A'"
I na ksh czegoś takiegoA=a; integer N=$(("'$A'")); print $N
(print lub printf nie jest potrzebne).Może:
Twoje zdrowie
źródło
Do tej pory bezzasadne rozwiązanie, po prostu bash i tylko małe litery.
z
jest szukaną postacią, tutajs
jako wyszukiwanie.i=97
ponieważ ascii (a) = 97. Reszta jest oczywista.Oczywiście możesz umieścić go w jednej linii. Oto kilka semmicolonów:
;;;;;
(powinno wystarczyć)źródło
read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
Spróbuj,
od -t d1
jeśli masz. Inne formaty wyjściowe są dość dziwne.Nie potrzebujesz też głowy i cięcia, na przykład:
źródło
Jeśli chcesz tylko program, który to robi, a nie robisz tego jako ćwiczenie, istnieje program o
ascii
takiej nazwie . Twoja dystrybucja może już oferować go jako pakiet, jeśli nie, pobierz go z http://www.catb.org/~esr/ascii/ .źródło
źródło