2012-11-07 12 views
81

क्या कोई मुझे हेलेडेसिमल संख्या को शेल स्क्रिप्ट में दशमलव संख्या में परिवर्तित करने के तरीके में मदद कर सकता है? जैसे मैं एक शैल स्क्रिप्ट का उपयोग कर हेक्साडेसिमल संख्या bfca3000 दशमलव में कनवर्ट करना चाहता हूं। मैं मूल रूप से दो हेक्साडेसिमल संख्याओं का अंतर चाहता हूं। मेरे कोड है:शेले स्क्रिप्ट में हेक्साडेसिमल से दशमलव तक

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

क्या आपने "डिस" टाइप किया था और उम्मीद है कि कोई जवाब लिखने में समय बिताने के लिए? –

+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

बीसी का उपयोग क्या है? – VenkateshJN

+1

क्या? बीसी _ एक मनमाना परिशुद्धता कैलकुलेटर भाषा_ है: बाहरी आदेश। –

+0

मैं मूल रूप से दो हेक्साडेसिमल संख्याओं को शेल स्क्रिप्ट में घटाना चाहता हूं। कोड निम्नानुसार है: var3 = 'echo" ibase = 16; $ var1 "| बीसी' \t \t var4 = 'echo" ibase = 16; $ var2 "| बीसी'। var5 = $ (($ var4- $ var3) पर, निष्पादन, मुझे एक त्रुटि मिल रही है: – VenkateshJN

10

विभिन्न उपकरण एक खोल के भीतर से आपके लिए उपलब्ध हैं। स्पुतनिक ने आपको अपने शुरुआती प्रश्न के आधार पर अपने विकल्पों का उत्कृष्ट अवलोकन दिया है। वह निश्चित रूप से वोट देने के लिए वोट देता है जब उसने आपको कई सही उत्तर दिए।

एक और है कि उनकी सूची में नहीं है:

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

लेकिन अगर सभी आप क्या करना चाहते घटाना है, क्यों 10 के आधार के लिए इनपुट को बदलने परेशान?

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

dc कमांड "डेस्क कैल्क" है। यह bc जैसे stdin से भी इनपुट लेगा, लेकिन "संचालन के क्रम" का उपयोग करने के बजाय, यह स्टैकिंग ("रिवर्स पोलिश") नोटेशन का उपयोग करता है। आप इसे इनपुट देते हैं जो इसे एक स्टैक में जोड़ता है, फिर इसे ऑपरेटरों को दें जो स्टैक से पॉप आइटम निकालते हैं, और परिणामों पर वापस धक्का देते हैं।

आदेशों ऊपर हम निम्नलिखित मिल गया है में:

  • 16i - डीसी बताता आधार 16 (हेक्साडेसिमल) में इनपुट स्वीकार करने के लिए। आउटपुट बेस नहीं बदलता है।
  • BFCA3000 - अपने प्रारंभिक संख्या
  • 17FF - एक यादृच्छिक हेक्स संख्या मैं अपने प्रारंभिक संख्या से घटाना उठाया
  • - - दो नंबर हम आगे बढ़ाया है जो लेते हैं, और घटाना बाद के पहले में से एक, फिर परिणाम को वापस स्टैक
  • p - स्टैक पर अंतिम आइटम प्रिंट करें। यह ढेर नहीं बदलता है, इसलिए ...
  • 10o - डीसी को आधार "10" में अपना आउटपुट प्रिंट करने के लिए कहता है, लेकिन याद रखें कि हमारी इनपुट नंबरिंग योजना वर्तमान में हेक्साडेसिमल है, इसलिए "10" का अर्थ है "16 "।
  • p - स्टैक पर अंतिम आइटम को फिर से मुद्रित करें ... इस बार हेक्स में।

आप डीसी के साथ शानदार जटिल गणित समाधान बना सकते हैं। शैल स्क्रिप्ट के लिए अपने टूलबॉक्स में रखना एक अच्छी बात है।

+4

+1 –

12

खोल का उपयोग कर यह करने के लिए एक और रास्ता (बैश या ksh, पानी का छींटा के साथ काम नहीं करता है):

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

'#' प्रतीक का अर्थ क्या है? क्या इसके उपयोग के बारे में अधिक पढ़ने के लिए कोई अन्य एप्लिकेशन या दस्तावेज है? – user1527227

+1

यहां उल्लेख किया गया है: [लिंक] (http://www.gnu.org/software/bash/manual/bashref.html#Shell- अंकगणितीय)। धारा 6.5 के अंत में यह कहता है: "... संख्याएं [आधार #] एन लेती हैं, जहां वैकल्पिक आधार अंकगणितीय आधार का प्रतिनिधित्व करने वाले 2 और 64 के बीच एक दशमलव संख्या है, और n उस आधार पर एक संख्या है। आधार # छोड़ा गया है, तो आधार 10 का उपयोग किया जाता है। 9 से अधिक अंकों को उस क्रम में लोअरकेस अक्षरों, अपरकेस अक्षरों, '@' और '_' द्वारा दर्शाया जाता है। यदि आधार 36 से कम या बराबर है, लोअरकेस और अपरकेस अक्षरों का उपयोग 10 से 35 के बीच संख्याओं का प्रतिनिधित्व करने के लिए एक दूसरे के लिए किया जा सकता है। " – fox

27

लिनक्स पर बिजीबॉक्स का एक बहुत ही हल्के एम्बेडेड संस्करण के साथ काम पारंपरिक आदेशों के कई मतलब है इस समाधान के लिए Peter Leung के लिए नहीं उपलब्ध (बीसी, printf, डीसी, मोती, अज़गर)

echo $((0x2f)) 
47 

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

क्रेडिट कर रहे हैं।

3

त्रुटि के रूप में रिपोर्ट प्रकट होता है जब चर अशक्त (या खाली) कर रहे हैं:

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

कि हो सकता है क्योंकि बीसी को दी मूल्य गलत था। यह अच्छी तरह से हो सकता है कि बीसी को UPPERcase मानों की आवश्यकता है। इसे BFCA3000 की आवश्यकता है, bfca3000 नहीं।

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" 

लेकिन वहाँ बैश के रूप में ईसा पूर्व [1] उपयोग करने के लिए कोई जरूरत नहीं है, कर सकता है अनुवाद और सीधे घटाव करते हैं:

#!/bin/bash 

var1="bfca3000" 
var2="efca3250" 

var5="$((16#$var2 - 16#$var1))" 

echo "Diference $var5" 

[1] नोट: मैं मान 64 बिट गणित में निरूपित किया जा सकता संभालने हूँ, के रूप में अंतर मैं गणना की गई थी आपकी मूल लिपि में n bash। 64 बिट्स में संकलित होने पर बैश ((2 ** 63) -1) से कम पूर्णांक तक सीमित है। यह बीसी के साथ एकमात्र अंतर होगा जिसमें ऐसी सीमा नहीं है।

0

पानी का छींटा और अन्य गोले में, आप

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

का उपयोग करने के लिए दशमलव एक हेक्साडेसिमल संख्या कन्वर्ट करने के लिए कर सकते हैं। यह बैश, या ksh, विशिष्ट नहीं है।

संबंधित मुद्दे