ASCII文字をA-Zまたはa-zの範囲で要求し、それに対応する数値を返すシェルスクリプトを記述しようとしています。たとえば、出力は次のようになります。
scarlet$ Please type a character between A and Z or between a and z:
scarlet$ A
scarlet$ The decimal value of A is: 65
私の試み:
#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "
POSIX:_printf a | od -A n -t d1
_
Perl:Perl -e 'print ord($ARGV[0])' a
Perl、UTF-8ロケールの場合はUTF-8に対応:Perl -C255 -e 'print ord($ARGV[0])' œ
POSIX:
$ printf %d\\n \'a
97
また、bash 4.0以降およびzshの非ASCII文字でも機能します。
$ printf %x\\n \'あ
3042
recode ..dump
を使用して、16進コードポイントを表示することもできます。
$ printf aあ|recode ..dump
UCS2 Mne Description
0061 a latin small letter a
3042 a5 hiragana letter a
多分:
#!/bin/bash
echo -n "Enter a letter:"
read A
echo ${A}|od -t d1|awk '{printf "%s",$2}';echo
乾杯
今までのところ、bashだけで小文字だけのod-lessソリューションです。 z
は検索される文字で、ここではs
が検索されます。 i=97
ascii(a)= 97であるため。残りは明白です。
z=s
i=97
for c in {a..z}
do
[ "$c" = "$z" ] && echo $i && break || ((i+=1))
done
もちろん、1行に入れることもできます。ここにいくつかのセミコロンがあります:;;;;;
(十分なはずです)
ある場合はod -t d1
をお試しください。他の出力形式はかなり奇妙です。
また、ヘッドとカットは必要ありません。たとえば、次のようになります。
printf "A" | od -t d1 | read addr num && echo $num
# 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
これを行うプログラムだけが必要で、これを演習として行わない場合は、これを行うascii
というプログラムがあります。あなたのディストリビューションは、パッケージを http://www.catb.org/~esr/ascii/ から取得していなければ、すでにパッケージとして提供している場合があります。