`$ गूंज ((0x63)) को समझना


18

मैं कमांड लाइन के माध्यम से हेक्साडेसिमल को बदलने का एक तरीका खोज रहा था और पाया कि एक बहुत आसान तरीका है echo $((0x63))

यह बहुत अच्छा काम कर रहा है लेकिन मैं थोड़ा भ्रमित हूं कि यहां क्या हो रहा है।

मुझे पता $(...)है कि आम तौर पर एक उप-शेल होता है, जहां बाहरी कमांड से पहले सामग्री का मूल्यांकन किया जाता है।

क्या यह अभी भी इस स्थिति में एक उप-शेल है? मैं नहीं सोच रहा हूं कि इसका मतलब यह होगा कि उप-शेल सिर्फ मूल्यांकन (0x63)कर रहा है जो एक कमांड नहीं है।

क्या कोई मेरे लिए आज्ञा तोड़ सकता है?

जवाबों:


27

$(...)एक कमांड प्रतिस्थापन है (न केवल एक उपधारा), बल्कि $((...))एक अंकगणितीय विस्तार है।

जब आप उपयोग करते हैं $((...)), तो ...एक अंकगणितीय अभिव्यक्ति के रूप में व्याख्या की जाएगी। इसका मतलब है, अन्य बातों के अलावा, कि एक हेक्साडेसिमल स्ट्रिंग को एक संख्या के रूप में व्याख्या किया जाएगा और दशमलव में परिवर्तित किया जाएगा। तब संपूर्ण अभिव्यक्ति को उस संख्यात्मक मान से बदल दिया जाएगा जो अभिव्यक्ति का मूल्यांकन करता है।

पैरामीटर विस्तार और कमांड प्रतिस्थापन की तरह, $((...))शेल के शब्द विभाजन और फ़ाइल नाम ग्लोबिंग से प्रभावित नहीं होने के लिए उद्धृत किया जाना चाहिए।

echo "$(( 0x63 ))"

एक साइड नोट के रूप में, एक अंकगणितीय अभिव्यक्ति में होने वाले चर को उनकी आवश्यकता नहीं है $:

$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78

2
यह भी ध्यान दें कि क्योंकि $((...))कमांड प्रतिस्थापन के साथ संघर्ष, किसी को echo "$( (echo x; echo y) | tr xy yx)"इसके बजाय लिखना याद रखना पड़ता है echo "$((echo x; echo y) | tr xy yx)"(भले ही कुछ गोले अभी भी बाद वाले को स्वीकार करेंगे, वाईएमएमवी)।
स्टीफन चेज़लस

@ स्टीफनचेलजैस और आप $(( ))उत्पादन कैसे करते हैं जो शब्द विभाजन या ग्लोबिंग से प्रभावित होता है?
हॉज लैजिंग


3

यह एक उपधारा नहीं है, लेकिन अंकगणितीय मूल्यांकन है। से man bash:

((अभिव्यक्ति))

अभिव्यक्ति का मूल्यांकन ARITHMETIC EVALUATION के तहत नीचे वर्णित नियमों के अनुसार किया गया है । यदि अभिव्यक्ति का मूल्य गैर-शून्य है, तो वापसी की स्थिति 0 है; अन्यथा वापसी की स्थिति 1. यह "अभिव्यक्ति" को बताने के लिए बिल्कुल बराबर है।


9
((...))के रूप में काफी नहीं है $((...))। दोनों अंकगणितीय मूल्यांकन करते हैं, लेकिन बाद वाले को स्ट्रिंग के रूप में परिणामी मान से बदल दिया जाता है।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.