जवाबों:
ये सभी अंकगणित से संबंधित हैं, लेकिन अलग-अलग तरीकों से और चर अलग-अलग तरीकों से बनाए जाते हैं। इनमें से कुछ bash
गोले के लिए विशिष्ट हैं , जबकि अन्य नहीं हैं।
$((...))
को अंकगणितीय विस्तार कहा जाता है , जो कि विशिष्ट bash
और ksh
गोले है। यह सरल पूर्णांक अंकगणित करने की अनुमति देता है , हालांकि कोई फ़्लोटिंग पॉइंट सामान नहीं है। अभिव्यक्ति का परिणाम अभिव्यक्ति को बदल देता है, जैसा echo $((1+1))
कि बन जाएगाecho 2
((...))
को अंकगणितीय मूल्यांकन के रूप में संदर्भित किया जाता है और इसका उपयोग if ((...)); then
या while ((...)) ; do
कथनों के भाग के रूप में किया जा सकता है । अंकगणितीय विस्तार विस्तार $((..))
ऑपरेशन के आउटपुट को प्रतिस्थापित करता है और इसका उपयोग चर को असाइन करने के लिए किया जा सकता है, i=$((i+1))
लेकिन सशर्त विवरणों में इसका उपयोग नहीं किया जा सकता है।$[...]
अंकगणित के विस्तार के लिए पुराना वाक्यविन्यास है जो कि पदावनत है। यह भी देखें । यह संभवत: इसलिए रखा गया था ताकि पुरानी bash
स्क्रिप्ट न टूटें। इसमें काम नहीं किया गया ksh93
, इसलिए मेरा अनुमान है कि यह सिंटैक्स बैश-विशिष्ट है। नोट : रिक्त स्थान यहाँ बहुत महत्वपूर्ण हैं; $[1+1]
सामान के साथ भ्रमित मत करो [ $a -eq $b ]
। [
रिक्त स्थान के साथ के रूप में जाना जाता है test
आदेश, और आप आम तौर पर निर्णय लेने की कुछ हिस्सों में यह देखते हैं। यह व्यवहार और उद्देश्य में बहुत अलग है।let
एक bash
और ksh
कीवर्ड है जो सरल अंकगणितीय मूल्यांकन के साथ चर निर्माण की अनुमति देता है। यदि आप एक स्ट्रिंग को वहां असाइन करने का प्रयास करते हैं जैसे let a="hello world"
कि आपको सिंटैक्स त्रुटि मिलेगी। में काम करता है bash
और ksh93
।$(...)
कमांड प्रतिस्थापन है, जहां आप सचमुच एक कमांड का आउटपुट लेते हैं और एक चर को असाइन करते हैं। यहां आपकी आज्ञा है expr
, जो स्थैतिक तर्क लेता है, जैसे expr arg1 arg2 arg3
, इसलिए रिक्त स्थान महत्वपूर्ण हैं। यह पूर्णांक अंकगणित के लिए एक छोटे कमांड-लाइन कैलकुलेटर की तरह है, साथ ही कुछ सही / गलत और regex प्रकार का सामान। यह एक शेल-न्यूट्रल कमांड है।यह भी ध्यान देने योग्य है कि अंकगणितीय विस्तार और कमांड प्रतिस्थापन POSIX मानक द्वारा निर्दिष्ट हैं , जबकि let
और $[...]
नहीं।
let
कमांड अंकगणित मूल्यांकन करता है और एक शेल बिल्ट-इन है।
यह आदेश चलाएँ और आपको कुछ भी नहीं मिलेगा (केवल मूल्यांकन करता है):
let 1+2
$(( ))
का उपयोग अंकगणितीय विस्तार करने के लिए किया जाता है : यहाँ पढ़ें
इसे चलाएं और आपको एक त्रुटि मिलेगी (विस्तार के कारण):
$((1+2))
$[ ]
अंकगणितीय विस्तार के लिए पुराना वाक्यविन्यास है:
पुराना प्रारूप $ [अभिव्यक्ति] पदावनत है और बैश के आगामी में हटा दिया जाएगा। बैश मैन पेज
expr
एक बाइनरी कमांड है, यदि आप कमांड सबसिस्टम के भीतर अंकगणितीय विस्तार करना चाहते हैं तो आप इसका उपयोग कर सकते हैं:
echo $(expr 1 + 2)
echo `expr 1 + 2`
ऊपर दिए गए कुछ उत्तरों के बाद से ksh93
यह विशेष रूप से ध्यान देने योग्य है कि यह फ्लोटिंग पॉइंट गणित कर सकता है, जैसे:
$ print $((1.0/3))
0.333333333333333333
आप प्रिंटफ के साथ आउटपुट की शुद्धता को नियंत्रित कर सकते हैं, जैसे:
$ printf "%.4f\n" $((1.0/3))
0.3333
ऊपर दिए गए फ्लोटिंग-पॉइंट नंबर के रूप में कम से कम एक तर्क निर्दिष्ट किया जाना चाहिए। यदि दोनों पूर्णांक के रूप में निर्दिष्ट किए जाते हैं तो केवल पूर्णांक गणित किया जाता है, जैसे:
$ print $((1/3))
0
यह तब सहायक हो सकता है जब आपको शेल स्क्रिप्ट में फ्लोटिंग पॉइंट गणित की आवश्यकता होती है क्योंकि आप बाहरी कमांड को कॉल करने से बच सकते हैं।
zsh
उत्तर पोस्ट किया है । के बाद से ksh
और bash
अधिक एक दूसरे को (सामान्य रूप में) के लिए इसी तरह की तुलना में या तो है कर रहे हैं zsh
, मुझे लगता है कि एक kh93
उस प्रश्न का जवाब आधारित काफी उपयोगी हो सकता है।
((...))
वास्तव में असाइनमेंट के लिए इस्तेमाल किया जा सकता हैbash
,ksh
औरzsh
:n=10; ((n+=10)); echo $n
20((x=1)); echo $x
प्रिंट करता है और 1. प्रिंट करता है