2012-11-07 31 views
81

有人可以幫助我告訴如何將一個十六進制數字轉換爲shell腳本中的十進制數字嗎?例如。我想使用shell腳本將十六進制數bfca3000轉換爲十進制數。我基本上想要兩個十六進制數字的區別。我的代碼是:十六進制到十進制的Shell腳本

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 "-") 
+3

您是否鍵入「dis」並期望有人花時間寫答案? –

+0

你錯過了'''最後,並有'.'來代替 –

+0

這是一個編輯錯誤。 – VenkateshJN

回答

197

要轉換HEX2DEC,這些都是很多方法可以做一個殼或腳本:

隨着

$ echo $((16#FF)) 
255 

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

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

$ printf "%d\n" 0xFF 
255 

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

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

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

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

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

bc的用途是什麼? – VenkateshJN

+1

什麼? bc是_任意精度計算器language_:外部命令。 –

+0

我基本上想要在shell腳本中減去兩個十六進制數字。代碼如下:var3 ='echo「ibase = 16; $ var1」| bc' \t \t var4 ='echo「ibase = 16; $ var2」| bc'。 var5 = $(($ var4- $ var3)在執行時,出現如下錯誤: – VenkateshJN

10

各種工具提供給您在外殼中。 Sputnick根據您最初的問題爲您提供了一個很好的選項概覽。他絕對值得的投票時間,他花了給你多個正確的答案。

還有一個,這不是他的名單上:

[[email protected] ~]$ dc -e '16i BFCA3000 p' 
3217698816 

但是,如果你想要做的是減法,爲什麼還要改變輸入爲10進制?

[[email protected] ~]$ dc -e '16i BFCA3000 17FF - p 10o p' 
3217692673 
BFCA1801 
[[email protected] ~]$ 

dc命令是「desk calc」。它也將採用stdin的輸入,如bc,但不是使用「操作順序」,而是使用堆棧(「逆波蘭」)符號。你給它添加到堆棧的輸入,然後給操作員從堆棧中彈出項目,並推回結果。

在上面我們已經有了下面的命令:

  • 16i - 告訴直流接受基數爲16(十六進制)輸入。不改變輸出基礎。
  • BFCA3000 - 您最初的數
  • 17FF - 我拿起從您最初的數減去一個隨機的十六進制數
  • - - 以這兩個數字,我們已經推,覈減然後將結果推回堆棧
  • p - 打印堆棧中的最後一個項目。這不會改變堆棧,所以...
  • 10o - 告訴dc打印輸出的基數爲「10」,但請記住我們的輸入編號方案當前是十六進制的,所以「10」表示「16 」。
  • p - 再次打印堆棧中的最後一項...這次是十六進制。

你可以用直流構造非常複雜的數學解答。在您的工具箱中使用shell腳本是一件好事。

+4

+1數學方式 –

12

使用shell做另一種方式(bash或ksh的,不劃線工作):

echo $((16#FF)) 
255 
+0

'#'符號的含義是什麼?是否有其他應用程序或文檔可以閱讀有關其使用的更多信息? – user1527227

+1

這裏提到:[鏈接](http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic)。在6.5節的結尾處,它說:「...數字採用[base#] n的形式,其中可選基數是2到64之間的十進制數,代表算術基數,n是該基數中的數字。鹼基#被省略,則使用鹼基10;大於9的數字以小寫字母,大寫字母'@'和'_'表示,如果基數小於或等於36,小寫字母和大寫字母可以互換使用,表示10到35之間的數字。「 – fox

27

在Linux上的busybox的一個非常輕量級的嵌入式版本處理意味着許多傳統的命令不可用(BC,printf的,DC,PERL,Python)的

echo $((0x2f)) 
47 

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

感謝Peter Leung此解決方案。

3

爲報告的錯誤時,變量是空(或空)顯示:

$ 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位數學表示,作爲差算出我在你的原始劇本中打擊。如果編譯爲64位,則Bash限制爲小於((2 ** 63)-1)的整數。這與bc唯一的區別是沒有這個限制。

0

在儀表板和其他炮彈,你可以使用

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

爲十六進制數轉換爲十進制。 這不是bash或ksh,具體。