如何在bash脚本中添加两个十六进制数

Dav*_*bin 8 bash shell-script

我想在 bash 脚本中添加两个十六进制变量。我希望它们以十六进制开头并以十六进制结尾,而不是十进制。

到目前为止,我想出了一些关于 hack 的方法。有没有更好或更优雅的解决方案?

BASE=0xA000

OFFSET=0x1000

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

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

echo $NEW_BASE

0xB000
Run Code Online (Sandbox Code Playgroud)

Rui*_*iro 9

我只想将您的脚本简化为:

printf "0x%X\n" $((0xA000 + 0x1000))
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 6

是的,在bashprintf是唯一的内置方式重新格式化在一个不同的基的数和只台8,10和16被支撑。

bash(与ksh93或 之类的外壳相反fish)中,使用命令替换意味着分叉子外壳。您可以printf -v在此处使用来避免使用子shell(也可以在zshforprintprintf( print -f) 的最新版本中使用,它也支持打印到数组中):

printf -v NEWBASE '%#X' "$((BASE + OFFSET))"
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

使用 ksh 和 zsh,您还可以强制将整数变量扩展到特定基数中:

typeset -i 16 NEWBASE
Run Code Online (Sandbox Code Playgroud)

扩展将在16#1FE形式。ksh93 支持最多 64 个zshmksh最多 36个的基数。

ksh93 的printf 内置支持以任意基数输出数字以及带或不带n#前缀:

$ printf '%..2d\n' 0x1FE
111111110
$ printf '%#..2d\n' 0x1FE
2#111111110
Run Code Online (Sandbox Code Playgroud)

在 ksh93 中,不分var=$(printf...)叉子外壳,因此与bash's一样有效printf -v