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