我想在 bash 脚本中添加两个十六进制变量。我希望它们以十六进制开始并以十六进制结束,而不是十进制。
到目前为止我所想出的是一些关于黑客的东西。有更好或更优雅的解决方案吗?
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
是的,inprintf
是在不同基数中重新格式化数字的唯一内置方法,并且仅支持基数 8、10 和 16。
在bash
(与ksh93
或 之类的 shell 相反fish
)中,使用命令替换意味着分叉子 shell。您可以使用printf -v
此处来避免使用子 shell(也可在zsh
forprint
和printf
( print -f
) 的最新版本中使用,它也支持打印到数组中):
printf -v NEWBASE '%#X' "$((BASE + OFFSET))"
(在 中bash
,与 相反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...)
不会分叉子 shell,因此与bash
s一样高效printf -v
。
答案3
在 GNU 或现代 BSD 中dc
你可以这样做:
echo A000 1000 | dc -e '16o16i?+p'
16o
设置输出基数。 16i
设置输入基础。从标准输入读取?
一行,在本例中将两个数字压入堆栈。 +
他们补充道。 p
打印堆栈顶部(答案)。
答案4
和 的和$hexNumA
是$hexNumB
:
printf "%x\n" $((16#$hexNumA + 16#$hexNumB))
您甚至可以轻松地将十进制添加到十六进制:
printf "%x\n" $((16#$hexNum + $decNum))
礼貌: ”在 Bash 中将十六进制转换为十进制”