ASCIIコード

bashのprintf関数で文字のASCIIコードの取得や文字への変換をします。鍵となるのは「¥’A」という表記。これは、シングルクォートでも、ダブルクォート「¥”A」でも良いようです。本当は、’とか”ですが、エスケープさせるために¥が必要らしいです。

参考:Bash Hackers Wiki

#! /usr/bin/sh

first=$(printf "%d" \'A)          #文字'A'をASCIIコード数値に変換(ord関数相当)
last=$(printf "%d" \'Z)           #文字'Z'をASCIIコード数値に変換

for (( ix=$first; ix<=$last; ix++ ))
do
    hex=$(printf "%x" $ix )       #16進数に変換 'A'=65=>0x41
    char=$(printf "\x${hex}")     #16進数を文字に変換 0x41=>'A'
    code=\'$char                  #printf用に仕立てる。’を付加
    printf "%c %d 0x%x\n" $char $code $code
done

実行結果

$ ./ascii.sh
A 65 0x41
B 66 0x42
C 67 0x43
D 68 0x44
E 69 0x45
F 70 0x46
G 71 0x47
H 72 0x48
I 73 0x49
J 74 0x4a
K 75 0x4b
L 76 0x4c
M 77 0x4d
N 78 0x4e
O 79 0x4f
P 80 0x50
Q 81 0x51
R 82 0x52
S 83 0x53
T 84 0x54
U 85 0x55
V 86 0x56
W 87 0x57
X 88 0x58
Y 89 0x59
Z 90 0x5a

シェルの関数で表現してみると次のようになりました。

#! /usr/bin/sh

# ord
# $1 ... 文字
function ord {
    echo $(printf "%d" \'$1)
}

# char
# $1 ... ASCIIコード
function char {
    hex=$(printf "%x" $1)
    echo $(printf "\x${hex}")
}

echo $(ord 'A')
echo $(char 65)

実行結果

$ ./test.sh
65
A