इसने बहुत परीक्षण और त्रुटि की लेकिन अंततः काम किया।
मैंने यूनुस से कुछ प्रेरणा ली। लेकिन अन्य सभी उत्तरों ने मेरे पुराने बैश (suse11sp1 [3.2.51 (1) -release) पर मदद नहीं की)
'फॉर' लूप ने अप्रत्यक्ष सरणी का विस्तार करने से इंकार कर दिया, इसके बजाय आपको इसे पूर्व-विस्तारित करने की आवश्यकता है, इसका उपयोग अपने दूसरे चर नाम के साथ एक और सरणी बनाने के लिए करें। नीचे मेरा उदाहरण एक डबल लूप दिखाता है, जैसा कि मेरा इच्छित उपयोग है।
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
TheNewVariable=$(eval echo \${${j#New_}things[@]})
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
मैं पहली सरणी प्रविष्टि से "New_" को हटाने के लिए # का उपयोग कर रहा हूं, फिर "FOOthings" प्राप्त करने के लिए, "चीजों" के साथ संक्षिप्त कर रहा हूं। प्रतिध्वनि और निष्कासन के साथ $ {}, फिर त्रुटियों को फेंकने के बिना उनकी बात करें, जिसे एक नए $ () में लपेटा गया है और नया चर नाम सौंपा गया है।
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
UPDATE ##### 2018/06/07
मैंने हाल ही में इस मुद्दे पर एक और स्पिन की खोज की है। बनाया गया चर वास्तव में एक सरणी नहीं है, लेकिन एक अंतरिक्ष सीमांकित स्ट्रिंग है। इसके ऊपर के कार्य के लिए यह ठीक था, क्योंकि "कैसे" काम करता है, यह सरणी को नहीं पढ़ता है, इसका विस्तार किया जाता है और फिर इसके माध्यम से लूप किया जाता है, नीचे देखें:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
लेकिन, मुझे तब इसे एक सरणी के रूप में उपयोग करने की आवश्यकता थी। इसके लिए मुझे एक और कदम उठाने की जरूरत थी। मैंने डेनिस विलियमसन द्वारा कोड वर्बेटिम लिया । मैंने इसका परीक्षण किया है और यह ठीक काम करता है।
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
"IFS = ','" आपके परिसीमन वाला एक चर है। "-a" के साथ "रीड" कट और सरणी चर में स्टिंग वापस खिलाती है। ध्यान दें, यह उद्धरण चिह्नों के लिए कोई सम्मान नहीं है, लेकिन इसे प्रबंधित करने के लिए पढ़ने में कुछ विकल्प हैं , उदाहरण के लिए मैंने -r ध्वज को हटा दिया है जिसकी मुझे आवश्यकता नहीं थी। इसलिए मैंने अब इसे वैरिएबल क्रिएशन में जोड़ दिया है, जिससे डेटा को ट्रीट किया जा सकता है और इसे उसी तरह से संबोधित किया जाना चाहिए जैसा कि इसे करना चाहिए।
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
IFS=', ' read -a TheNewVariable <<< $(eval echo \${${j#New_}things[@]})
for i in ${TheNewVariable[@]} #Now have to wrap with {} and expand with @
do
echo $j $i" hello"
echo ${TheNewVariable[$i]} #This would not work in the original code
echo
done
done