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進のみがサポートされています。
bash
(ksh93
または同じシェルとは対照的に)でfish
コマンド置換を使用することは、サブシェルを分岐することを意味します。ここでサブシェルの使用を防ぐことができます (最新バージョンの for および ( )printf -v
でも使用可能であり、配列としての印刷もサポートしています)。zsh
print
printf
print -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基zsh
とmksh
最大36基をサポートします。
ksh93のprintf
組み込み関数は、n#
プレフィックスの有無にかかわらず、すべてのデフォルトの数値出力をサポートします。
$ printf '%..2d\n' 0x1FE
111111110
$ printf '%#..2d\n' 0x1FE
2#111111110
ksh93では、var=$(printf...)
サブシェルは分岐しないため、bash
sほど効率的です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進数に変換する」