在Shell脚本中hex为十进制

有人可以帮助我告诉如何将一个hex数字转换为一个shell脚本中的十进制数字? 例如,我想要使用shell脚本将hex数bfca3000转换为十进制。 我基本上想要两个hex数字的区别。 我的代码是:

 var3=`echo "ibase=16; $var1" | bc` var4=`echo "ibase=16; $var2" | bc` var5=$(($var4-$var3)) # [Line 48] 

执行后,我得到的错误是:

 Line 48: -: syntax error: operand expected (error token is "-") 

要转换hex2dec,可以通过多种方法在shell或脚本中执行此操作:

用bash :

 $ echo $((16#FF)) 255 

与bc :

 $ echo "ibase=16; FF" | bc 255 

用perl :

 $ perl -le 'print hex("FF");' 255 

与printf :

 $ printf "%d\n" 0xFF 255 

与python :

 $ python -c 'print(int("FF", 16))' 255 

用ruby :

 $ ruby<<EOF p "FF".to_i(16).to_s(10) EOF "255" 

用node.js :

 $ nodejs <<< "console.log(parseInt('FF', 16))" 255 

与犀牛 :

 $ rhino<<EOF print(parseInt('FF', 16)) EOF ... 255 

与groovy :

 $ groovy -e 'println Integer.parseInt("FF",16)' 255 

在Linux上处理一个非常轻量级的busyboxembedded式版本意味着许多传统命令不可用(bc,printf,dc,perl,python)

 echo $((0x2f)) 47 hexNum=2f echo $((0x${hexNum})) 47 

感谢Peter Leung提供的解决scheme。

还有一种方法可以使用shell(bash或ksh,不能用破折号):

 echo $((16#FF)) 255 

您可以从一个shell内使用各种工具。 根据你最初的问题,Sputnick已经给你一个很好的选项概述。 他绝对值得的投票时间,他花了给你多个正确的答案。

还有一件不在他的名单上:

 [ghoti@pc ~]$ dc -e '16i BFCA3000 p' 3217698816 

但是,如果你想要做的只是减去,为什么麻烦改变input到基地10?

 [ghoti@pc ~]$ dc -e '16i BFCA3000 17FF - p 10o p' 3217692673 BFCA1801 [ghoti@pc ~]$ 

dc命令是“desk calc”。 它也将采用stdin的input,如bc ,但是不使用“操作顺序”,而是使用堆栈(“逆波兰”)符号。 你给它添加到堆栈的input,然后给操作员从堆栈中popup项目,并推回结果。

在上面的命令中,我们得到了以下内容:

  • 16i – 告诉dc接受基地16(hex)的input。 不改变输出基地。
  • BFCA3000 – 您的初始号码
  • 17FF – 一个随机的hex数字,我select从您的初始数字减去
  • -取两个我们推过的数字,从后面的数字中减去,然后把结果推回栈中
  • p – 打印堆栈中的最后一个项目。 这不会改变堆栈,所以…
  • 10o – 告诉dc在“10”的基础上打印输出,但请记住,我们的input编号scheme目前是hex的,所以“10”的意思是“16”。
  • p – 再次打印堆栈中的最后一个项目…这次是hex。

你可以用直stream构造非常复杂的math解决scheme。 在shell脚本的工具箱中,这是一件好事。

报告的错误出现在variables为空(或空)时:

 $ unset var3 var4; var5=$(($var4-$var3)) bash: -: syntax error: operand expected (error token is "-") 

这可能会发生,因为提供给bc的值是不正确的。 这很可能是因为BC需要UPPERcase值。 它需要BFCA3000 ,而不是bfca3000 。 这很容易在bash中修复,只需使用^^扩展:

 var3=bfca3000; var3=`echo "ibase=16; ${var1^^}" | bc` 

这将改变这个脚本:

 #!/bin/bash var1="bfca3000" var2="efca3250" var3="$(echo "ibase=16; ${var1^^}" | bc)" var4="$(echo "ibase=16; ${var2^^}" | bc)" var5="$(($var4-$var3))" echo "Diference $var5" 

但是没有必要使用bc [1],因为bash可以直接执行转换和减法:

 #!/bin/bash var1="bfca3000" var2="efca3250" var5="$(( 16#$var2 - 16#$var1 ))" echo "Diference $var5" 

[1] 注意:我假设这些值可以用64位math表示,因为差异是在原始脚本中用bash计算的。 如果以64位编译,则Bash被限制为小于((2 ** 63)-1)的整数。 这与bc唯一的区别是没有这个限制。

在短跑和其他贝壳,你可以使用

 printf "%d\n" (your hexadecimal number) 

将hex数转换为十进制数 这不是bash,或ksh,具体。