虽然您尝试使用awk 和bc 来实现,但我在这里为您提供最方便的选择:printf。这使您可以轻松地在十进制、八进制和十六进制之间进行转换。
[bash] % printf "%d" 0xFFFFFF # hex2dec
16777215
[bash] % printf "%#O" 0xFFFFFF # hex2oct
077777777
[bash] % printf "%d" 077777777 # oct2dec
16777215
[bash] % printf "%d" 077777777 # oct2hex
0xFFFFFF
[bash] % printf "%#x" 16777215 # dec2hex
0xFFFFFF
[bash] % printf "%#O" 16777215 # dec2oct
077777777
额外的字符 # 要求 printf 插入前缀 0X 用于十六进制数字,0 用于八进制数字。如果您以十六进制形式添加数字,请不要忘记为数字添加前缀0x,并为八进制数字添加前缀0。
当然bash 可以选择进行算术运算。
man bash((expression))
表达式根据下面算术评估中描述的规则进行评估。如果表达式的值非零,则返回状态为0;否则返回状态为1。这完全等同于let "expression"。
这使您可以直接进行所有计算。例如。你想要 0xFFFFFF 并减去小数 5 并除以 100(十进制)并减去 1000 小数,你有
[bash] % printf "%d" $(( (0xFFFFFF - 5)/100 - 1000 ))
166772
或者你可以全部使用十六进制::
[bash] % printf "%d" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 ))
61439
如果您现在想将这样的数字存储在变量中,您只需这样做
[bash] % vardec=$( printf "%d" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
[bash] % varhex=$( printf "%#x" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
[bash] % varoct=$( printf "%#O" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
但是,十进制是一种特殊情况,您可以去掉printf:
[bash] % vardec=$(( (0xFFFFFF - 0x5)/0x100 - 0x1000 ))
bash 的算术评估系统允许您以任何基数(最高为基数 64)写入任何数字,并将其转换为十进制。在这里,我将一个基数为 3 的数字 3#1212 转换为数字 50。
[bash] % echo $(( 3#1212 ))
50
如果您想使用 zsh,您可以转换回任何其他基础:
[zsh] % echo $(( [##2]7 )) # from base 10 to base 2
111
[zsh] % echo $(( [##5]3#1020101100 )) # from base 3 to base 5
1234321
[zsh] % echo $(( [##36]17#415C67A8 )) # from base 17 to base 36
ROFLOL