我想在 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)
是的,在bash,printf是唯一的内置方式重新格式化在一个不同的基的数和只台8,10和16被支撑。
在bash(与ksh93或 之类的外壳相反fish)中,使用命令替换意味着分叉子外壳。您可以printf -v在此处使用来避免使用子shell(也可以在zshforprint和printf( 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 个zsh和mksh最多 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。
| 归档时间: |
|
| 查看次数: |
22760 次 |
| 最近记录: |