2016-01-11 20 views
-2

我想將十六進制值轉換爲十進制值,執行一些算術運算並將其轉換回十六進制。 在試圖這樣做,我對着下面的錯誤,無效號碼(錯誤標記爲「16 ## 0x00a002」)

「myshell.sh:線77:16 ## 0x00a002:無效號碼(誤差記號是 「16 ## 0x00a002」)

代碼的相關行是:

SUBVER3_1=$((16##$SUBVER3_1)) 

有人可以讓我知道:

  1. 這個錯誤是什麼,我該如何解決它?
  2. 如何在shell中對十六進制數進行算術運算?
+0

的[十進制轉換爲十六進制,在UNIX shell腳本]可能的複製(http://stackoverflow.com/questions/378829/convert-十進制到十六進制在UNIX的殼-script) –

+2

你的腳本代碼段是無效的'sh' - 你應該用'bash'(恕我直言,最可能的),'ksh'或'zsh'來標記它。 – tripleee

回答

4

0x前綴對於基數爲16的表示法無效。在轉換之前將其剝離。此外,如果您使用Bash,則基礎轉換的語法在基礎之後使用單個#

SUBVER3_1=$((16#${SUBVER3_1#0x})) 

這使用了傳統的POSIX ${variable#prefix}表示法來剝離的前綴。 #base#string表示法無關。

shell支持基本整數算術。算術運算獨立於您正在使用的基礎;簡單的添加等,如$((255+255))也可以使用基數爲16的符號,也可以使用$((16#FF+16#FF)),但請記住,只有整數的除法的用處非常有限。如果你想在十六進制結果,printf能做到這一點:

printf "%04x\n" $((16#ff + 16#ff)) 
+0

'16 ##'是一個shell特有的特性,還是由POSIX指定的東西? –

+2

它不在POSIX中,儘管我相信'ksh'和'zsh'也支持類似的東西。 OP使用Bash算術評估語法,所以這就是我猜他們實際使用的。 – tripleee

+0

[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04)雖然似乎表示支持'0x'前綴本身。 –

0

的問題已經解決, 我用過的打印語句來解決這個問題,而不是上述聲明

SUBVER3_1 = $(printf的「%的X」 $ SUBVER3_1)#從十進制轉換爲十六進制

該服務的目的