Bashで進数を10進数に変換する方法到着もう1つの基本、特に16進数です。別の方向に行くのは簡単なようです。
$ echo $((16#55))
85
Webを検索しながら数学と文字操作を実行して関数として使用できる変換を実行するスクリプトを見つけましたが、bashには既に基数変換が組み込まれているようです。これは可能ですか?
答え1
bash
(またはそのprintf
コマンドが利用可能な場合は、任意のシェル(通常はシェルに組み込まれている標準のPOSIXコマンド))を使用してください。
printf '%x\n' 85
を使用すると、zsh
次の操作も実行できます。
dec=85
hex=$(([##16]dec))
これは2から36までのデフォルトの数字に適用されます(0-9a-z
数字は大文字と小文字を区別しません)。
$(([#16]dev))
オプションが有効になると(1つだけ)または(デフォルト16の特別な場合として)に#
展開されます(デフォルト8にも適用されます(オプションも有効な場合は代わりに))。16#55
0x55
cbases
0125
8#125
octalzeroes
Pass 以下をksh93
使用できます。
dec=85
base54=${ printf %..54 "$dec"; }
2〜64進数に適用されます(0-9a-zA-Z@_
数字と同じ)。
にksh
はzsh
次のものもあります。
$ typeset -i34 x=123; echo "$x"
34#3l
ksh88、zsh、および pdksh には最大 36 のベースがあり、ksh93 には最大 64 のベースがあります。
long
これらはすべてシステムの整数サイズに制限されます(int
一部のシェルでは)。より大きなものには、またはbc
を使用できますdc
。
$ echo 'obase=16; 9999999999999999999999' | bc
21E19E0C9BAB23FFFFF
$ echo '16o 9999999999999999999999 p' | dc
21E19E0C9BAB23FFFFF
サポートされているデフォルトの範囲は、2つからPOSIXが要求する少なくとも99までです。 16より大きい進数の場合、9より大きい数字は、スペースで区切られた0で埋められた10進数で表されます。
$ echo 'obase=30; 123456' | bc
04 17 05 06
dc
または(bc
一部のシステムではまだラッパーである)と同じですdc
。
$ echo 30o123456p | dc
04 17 05 06
答え2
printfを使用してください:
$ printf "%d %x\n" $((16#55)) $((10#85))
85 55
変数に値を代入するには、コマンド置換を使用します。
$ x=$( printf "%x" 85 ) ; echo $x
55
答え3
すべてのPOSIX互換シェルにある組み込み算術拡張機能を使用して置き換えます。これは最近ほとんど普遍的です。
$ echo $((0xbc))
188
そして
$ hex=dead
$ dec=$((0x$hex))
$ echo $dec
57005
注:特に最後の例で拡張すると、予期しない結果が生じる可能性があります。変数 "hex" の 16 進数は、正当な 16 進定数を形成する必要があります。そうしないと、あいまいなエラー メッセージが発生する可能性があります。たとえば、「hex」が「0xdead」の場合、算術拡張は0x0xdeadになり、これは定数として解釈できません。もちろん、この場合、算術拡張 $(($hex)) はトリックを実行します。読者は、オプションの「0x」プレフィックスを削除するための単純な部分文字列処理パターンマッチングを作成する練習のままにします。
答え4
awkを使用できます。ベルベット図書館:
$ velour -n 'print n_baseconv(15, 10, 16)'
F
または:
$ velour -n 'print n_baseconv(ARGV[1], 10, 16)' 15
F