我想在 bash 脚本中添加两个十六进制变量。我希望它们以十六进制开头并以十六进制结尾,而不是十进制。
到目前为止,我想出的是关于 hack 的一个回合。有更好或更优雅的解决方案吗?
BASE=0xA000
OFFSET=0x1000
NEW_BASE=$(( $BASE + $OFFSET ))
NEW_BASE=`printf "0x%X\n" $NEW_BASE`
echo $NEW_BASE
0xB000
我想在 bash 脚本中添加两个十六进制变量。我希望它们以十六进制开头并以十六进制结尾,而不是十进制。
到目前为止,我想出的是关于 hack 的一个回合。有更好或更优雅的解决方案吗?
BASE=0xA000
OFFSET=0x1000
NEW_BASE=$(( $BASE + $OFFSET ))
NEW_BASE=`printf "0x%X\n" $NEW_BASE`
echo $NEW_BASE
0xB000
我只是将您的脚本简化为:
是的,in
bash
是printf
唯一一种以不同基数重新格式化数字的内置方法,并且仅支持基数 8、10 和 16。在
bash
(与ksh93
or之类fish
的 shell 不同)中,使用命令替换意味着分叉一个子 shell。您可以printf -v
在此处使用来避免使用 subshell(在zsh
forprint
和printf
(print -f
) 的最新版本中也可用,它也支持打印到数组中):(在
bash
,相反zsh
,$((...))
是分词的,所以需要引用以避免依赖$IFS
)。在
zsh
中,您可以将扩展基数指定为算术扩展语法的一部分(基数 2 到 36):使用 ksh 和 zsh,您还可以强制整数变量的扩展位于特定基数中:
扩展将是
16#1FE
形式。ksh93 支持最多 64 个zsh
和mksh
最多 36 个的碱基。ksh93 的
printf
内置支持以任意基数输出数字,也可以带或不带n#
前缀:在 ksh93 中,不分叉子外壳,因此与's
var=$(printf...)
一样有效。bash
printf -v
在 GNU 或现代 BSD
dc
中,您可以这样做:16o
设置输出基数。16i
设置输入基数。?
从标准输入读取一行,在这种情况下将两个数字压入堆栈 。+
添加它们。p
打印堆栈的顶部(答案)。在 bash 中,这似乎是一个好方法。您还可以调用诸如 bc/dc 之类的工具(取决于您的偏好)... echo 'obase=30; 123456' | 公元前
但我更喜欢 bash 方法在我看来你做得很好
和的
$hexNumA
和$hexNumB
是:您甚至可以轻松地将十进制添加到十六进制:
礼貌:“在 Bash 中将十六进制转换为十进制”