在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,具体。