Bashスクリプトに2つの16進数を追加する方法

Bashスクリプトに2つの16進数を追加する方法

Bashスクリプトに2つの16進変数を追加したいです。 10進数ではなく16進数で始めて終了することを願っています。

これまで私が思いついたのは、ハッキングに関することです。より良い、よりエレガントなソリューションはありますか?

BASE=0xA000

OFFSET=0x1000

NEW_BASE=$(( $BASE + $OFFSET ))

NEW_BASE=`printf "0x%X\n" $NEW_BASE`

echo $NEW_BASE

0xB000

答え1

スクリプトを次のように単純化します。

printf "0x%X\n" $((0xA000 + 0x1000))

答え2

bashはい、inはprintf数値の形式を別の進数に再指定する唯一の組み込み方法で、8、10、16進のみがサポートされています。

bashksh93または同じシェルとは対照的に)でfishコマンド置換を使用することは、サブシェルを分岐することを意味します。ここでサブシェルの使用を防ぐことができます (最新バージョンの for および ( )printf -vでも使用可能であり、配列としての印刷もサポートしています)。zshprintprintfprint -f

printf -v NEWBASE '%#X' "$((BASE + OFFSET))"

(Inbashとは異なり、zsh噴射$((...))の影響を受けるため、依存しない場合は引用する必要があります$IFS。)

では、zsh算術拡張構文(進数2〜36)の一部として拡張された基数を指定できます。

$ echo $(([#16] 0xff + 0xff))
16#1FE
$ echo $(([##16] 0xff + 0xff))
1FE
$ echo 0x$(([##16] 0xff + 0xff))
0x1FE
$ echo $(([##2] 0xff + 0xff))
111111110

kshとzshを使用すると、次のように整数変数を特定の基準に拡張することもできます。

typeset -i 16 NEWBASE

拡張は次の16#1FE形式を取ります。 ksh93は最大64基zshmksh最大36基をサポートします。

ksh93のprintf 組み込み関数は、n#プレフィックスの有無にかかわらず、すべてのデフォルトの数値出力をサポートします。

$ printf '%..2d\n' 0x1FE
111111110
$ printf '%#..2d\n' 0x1FE
2#111111110

ksh93では、var=$(printf...)サブシェルは分岐しないため、bashsほど効率的ですprintf -v

答え3

GNUや最新のBSDでは、dc次のことができます。

echo A000 1000 | dc -e '16o16i?+p'

16o出力ベースを設定します。 16i入力ベースを設定します。標準入力から1行を読みます?。この場合、2つの数字をスタックにプッシュします。 +彼らは付け加えた。 pスタックの一番上(答え)を印刷します。

答え4

合計の合計は次$hexNumAのとおりです$hexNumB

printf "%x\n" $((16#$hexNumA + 16#$hexNumB))

16進数に10進数を簡単に追加することもできます。

printf "%x\n" $((16#$hexNum + $decNum))

礼儀正しい: "Bashで16進数を10進数に変換する

関連情報