シェルで2進数、8進数、10進数、16進数変換@bash

シェルスクリプトで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進数以外には変換できなさそうです。

タイトルとURLをコピーしました