文字のASCII数値を取得する


10

AZまたはazの範囲のASCII文字を要求し、同等の数値を返すシェルスクリプトを記述しようとしています。たとえば、出力は次のようになります。

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

2つ目の質問は無関係であるため、編集しました。あなたがすべき個別にポスト(あなたは、元のテキストを取得することができ、ここで
マイケル・Mrozek

あなたの例は私のために働く。何が起こっているかを示す出力を貼り付け、エラーが何であるかを説明できますか?DOESは、echo -n Aあなたが期待するものですか?そうでない場合は、printf代わりに試してください。DOESは、od -iあなたが期待するものですか?そうでない場合は、お試しくださいod -t d1
ミケル

1
私はod -t d1を試してみましたが、うまくいきました...ありがとう
ホスト投稿

回答:


8

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])' œ


8

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

2
それを「あいまいさ」をやや少なくするために、例えばA=a ; printf '%d\n' "'$A'"、kshのようなものを使用することもできますA=a; integer N=$(("'$A'")); print $N(printまたはprintfは必要ありません)。
jelmd 2017年

3

多分:

#!/bin/bash

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

乾杯


nawkではなくawkを使用します。これは、どのawkバージョンにもかなり標準的です。
asoundmove 2011年

編集、私は仕事でawkをしていないので 'nawk'を使用する私の習慣です
D4RIO

はい、あなたの解決策も私のために働きました..感謝
ホストポスト

1

これまでのところ、ODを使用しないソリューションです。z検索された文字sです。ここでは検索です。i=97ascii(a)= 97だからです。残りは明白です。

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

もちろん、1行に入れることもできます。ここにいくつかのセミコロンがあります:(;;;;;十分であるべきです)


上記のコードをテストしましたが、うまくいきませんでした。「i + = 1」が見つからないというメッセージが表示されました。
ホストポスト

これはbashで動作します。代わりにi = $((i + 1))が必要になる場合があります。
ユーザー不明

1行で、キーボードからキーを読み取る場合:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
erik

0

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

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

printf "A" | od -t d1 | read addr num && echo $num

0

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


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.