シェルスクリプトで2進数や16進数を扱う方法です。bc コマンドを使う方法と、printf コマンドを使う方法、シェル(bash)の機能を使う方法の3つを紹介します。
bcコマンドを使う方法
16進数”A”を10進数に変換。
※Aは大文字にする必要があります。
# echo "obase=10; ibase=16; A" | bc 10
obase=10が出力形式(=10進数)、ibase=16が入力の形式(=16進数)です。デフォルトは10なので、obaseは省略することができます。なお、obase → ibaseの順で書く必要があり、逆にすると以下のように動きませんでした。
# echo "ibase=16; obase=10; A" | bc A
16進数を2進数に変換
# echo "obase=2; ibase=16; F" | bc 1111
こちらはobaseとibaseを入れ替えても以下の通り動きましたが、バグを出さないためにも、obase → ibase の順で書くのがよさそうです。
# echo "ibase=16; obase=2; F" | bc 1111
printfコマンドを使う方法
16進数”A”を10進数に変換
# printf '%d\n' 0xA 10
0xを付けて”A”が16進であることを表してます。シングルクォートの中が出力フォーマットで、%d が10進数で出力することを表します。Cのprintfと同じで改行されないので、\n を追加しています。
10進数”10″を16進数に変換。
# printf '%x\n' 10 a
# printf '%X\n' 10
A
%xが16進数を意味し、xが小文字の場合16進数のアルファベット部分は小文字で出てき、大文字にするとアウトプットも大文字になります。
10進数の8を8進数に変換。
# printf '%o\n' 8 10
8進数を入力する場合は、頭に0(ゼロ)をつけます。
# printf '%d\n' 010 8
なお、printfで2進数は扱えないようです。
シェルの機能を使う方法
シェル(bash)の機能でも変換できます。
以下は16進数(F) を10進数に変換する例です。
echo $((0xF)) 15
8進数(10)を10進数に変換
echo $((010)) 8
任意の基底(xx進数)を選ぶ事もできます。例えば、頭に2#を付けると2進数を意味します。2進数11 を10進数に変換する例です。
# echo $((2#11))
3
なお、10進数以外には変換できなさそうです。