सबसे पहले, आपको कथन $(echo $FRUITS)
में उपयोग करने की आवश्यकता नहीं है for
। सिर्फ उपयोग करना $FRUITS
काफी है। फिर आप लूप के अंदर एक लाइन के साथ, उपयोग करके दूर कर सकते हैं eval
।
eval
बस बैश बताता है एक दूसरे बनाने के लिए मूल्यांकन (यानी एक और अपनी सामान्य मूल्यांकन की तुलना में) निम्नलिखित बयान की। \$
के रूप में पहली मूल्यांकन बचता $
है, और अगले मूल्यांकन तो यह व्यवहार करता है $
एक चर नाम की शुरुआत, के रूप में जो "पीला", आदि ले कर जाता है
इस तरह आपको एक अलग कदम रखने की आवश्यकता नहीं है जो एक अंतरिम स्ट्रिंग बनाता है (जो कि मेरा मानना है कि आपके प्रश्न का मुख्य इरादा था)।
for fruit in $FRUITS ;do
eval echo $fruit is \$${fruit}_COLOUR
done
एक वैकल्पिक विधि के लिए, जैसा कि एक टिप्पणी में पैट्रिक द्वारा उल्लेख किया गया है , आप इसके बजाय एक साहचर्य सरणी का उपयोग कर सकते हैं , जिसमें किसी तत्व के सूचकांक को पूर्णांक होने की आवश्यकता नहीं है। आप एक स्ट्रिंग का उपयोग कर सकते हैं, जैसे कि एक प्रकार का फल। यहाँ एक उदाहरण है, bash के साहचर्य सरणी का उपयोग करते हुए:
# This declares an associative array (It unsets it if it already exists)
declare -A colour
colour['BANANA']="Yellow"
colour["APPLE"]="Green or Red"
colour[MARTIAN ORANGE]="Blue"
for fruit in BANANA APPLE "MARTIAN ORANGE" ;do
echo "$fruit" is "${colour[$fruit]}"
done
!
वाक्य रचना चर प्रतिस्थापन पर एक झंडा मूल रूप से कहना है कि "विकल्प दो बार" है। यह इस आवश्यकता को परिवर्तित नहीं करता है कि${…}
एक चर नाम के अंदर क्या होना चाहिए। तो नहीं, आप एक चर का उपयोग करने से बच सकते हैं जिसमें नाम शामिल है, जब तक कि आप एक अलग विधि (eval
) का उपयोग न करें ।