web-dev-qa-db-ja.com

数値を取得ASCII文字の値

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 " "
10
Host Post

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
8
Lri

多分:

#!/bin/bash

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

乾杯

3
D4RIO

今までのところ、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行に入れることもできます。ここにいくつかのセミコロンがあります:;;;;;(十分なはずです)

1
user unknown

ある場合はod -t d1をお試しください。他の出力形式はかなり奇妙です。

また、ヘッドとカットは必要ありません。たとえば、次のようになります。

printf "A" | od -t d1 | read addr num && echo $num
0
Mikel
# 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
0
Peter.O

これを行うプログラムだけが必要で、これを演習として行わない場合は、これを行うasciiというプログラムがあります。あなたのディストリビューションは、パッケージを http://www.catb.org/~esr/ascii/ から取得していなければ、すでにパッケージとして提供している場合があります。

0
bahamat