ब्रेसिज़ ( $var
बनाम ${var}
)
ज्यादातर मामलों में, $var
और ${var}
समान हैं:
var=foo
echo $var
# foo
echo ${var}
# foo
ब्रेस को केवल अभिव्यक्ति में अस्पष्टता को हल करने की आवश्यकता होती है:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
उद्धरण ( $var
बनाम "$var"
बनाम "${var}"
)
जब आप एक चर के चारों ओर दोहरे उद्धरण जोड़ते हैं, तो आप शेल को एक ही शब्द के रूप में मानते हैं, भले ही उसमें व्हाट्सएप शामिल हो:
var="foo bar"
for i in "$var"; do # Expands to 'for i in "foo bar"; do...'
echo $i # so only runs the loop once
done
# foo bar
निम्नलिखित के साथ उस व्यवहार का विरोध करें:
var="foo bar"
for i in $var; do # Expands to 'for i in foo bar; do...'
echo $i # so runs the loop twice, once for each argument
done
# foo
# bar
$var
बनाम के रूप में ${var}
, ब्रेसिज़ केवल असंतोष के लिए आवश्यक हैं, उदाहरण के लिए:
var="foo bar"
for i in "$varbar"; do # Expands to 'for i in ""; do...' since there is no
echo $i # variable named 'varbar', so loop runs once and
done # prints nothing (actually "")
var="foo bar"
for i in "${var}bar"; do # Expands to 'for i in "foo barbar"; do...'
echo $i # so runs the loop once
done
# foo barbar
ध्यान दें कि "${var}bar"
ऊपर के दूसरे उदाहरण में भी लिखा जा सकता है "${var}"bar
, जिस स्थिति में आपको ब्रेस की आवश्यकता नहीं है, अर्थात "$var"bar
। हालांकि, यदि आपके स्ट्रिंग में बहुत सारे उद्धरण हैं, तो इन वैकल्पिक रूपों को पढ़ना मुश्किल हो सकता है (और इसलिए बनाए रखना मुश्किल है)। यह पृष्ठ बैश में उद्धृत करने के लिए एक अच्छा परिचय प्रदान करता है।
Arrays ( $var
बनाम $var[@]
बनाम ${var[@]}
)
अब आपकी सरणी के लिए। बाश मैनुअल के अनुसार :
बिना सबस्क्रिप्ट के एक ऐरे वेरिएबल को रेफर करना 0 के सबस्क्रिप्ट के साथ एरे को संदर्भित करने के बराबर है।
दूसरे शब्दों में, यदि आप एक सूचकांक की आपूर्ति नहीं करते हैं, तो आपको []
सरणी का पहला तत्व मिलता है:
foo=(a b c)
echo $foo
# a
जो बिल्कुल वैसा ही है
foo=(a b c)
echo ${foo}
# a
किसी सरणी के सभी तत्वों को प्राप्त करने के लिए, आपको @
सूचकांक के रूप में उपयोग करने की आवश्यकता है , जैसे ${foo[@]}
। ब्रेसिज़ को सरणियों के साथ आवश्यक है क्योंकि उनके बिना, शेल $foo
पहले भाग का विस्तार करेगा , सरणी का पहला तत्व देगा जिसके बाद एक लीटर होगा [@]
:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
यह पृष्ठ बैश में सरणियों का एक अच्छा परिचय है।
पुनरीक्षित उद्धरण ( ${foo[@]}
बनाम "${foo[@]}"
)
आपने इस बारे में नहीं पूछा, लेकिन यह एक सूक्ष्म अंतर है जिसके बारे में जानना अच्छा है। यदि आपके एरे में तत्वों में व्हॉट्सएप हो सकता है, तो आपको दोहरे उद्धरण चिह्नों का उपयोग करने की आवश्यकता है ताकि प्रत्येक तत्व को एक अलग शब्द के रूप में माना जाए: "
foo=("the first" "the second")
for i in "${foo[@]}"; do # Expands to 'for i in "the first" "the second"; do...'
echo $i # so the loop runs twice
done
# the first
# the second
दोहरे उद्धरणों के बिना व्यवहार के साथ इसका विरोध करें:
foo=("the first" "the second")
for i in ${foo[@]}; do # Expands to 'for i in the first the second; do...'
echo $i # so the loop runs four times!
done
# the
# first
# the
# second
bash
स्क्रिप्ट में तर्कों पर पुनरावृति कैसे करें ?