2011-01-03 13 views
25

मान लीजिए मैं कुछ bash सरणियों है:बैश अप्रत्यक्ष सरणी संबोधित?

A1=(apple trees) 
A2=(building blocks) 
A3=(color television) 

और सूचकांक J=2, कैसे A2 की सरणी सामग्री प्राप्त करने के लिए?

+0

यह बहुत अच्छा है। मैं खुद को एक बैश विशेषज्ञ मानता हूं और मैं हमेशा इस धारणा के तहत था कि बैश सरणी संकेत नहीं कर सकता जैसे '$ {! Ind [@]}' लेकिन मैंने इसे हल करने के लिए कभी भी temp var पेश करने का विचार नहीं किया। – SiegeX

+0

दिलचस्प सवाल/उत्तर! –

+0

आपको अपना जवाब उत्तर के रूप में पोस्ट करना चाहिए। समय सीमा समाप्त होने पर आप इसे स्वीकार करने में सक्षम होंगे। यहां सामान्य तरीके का एक उदाहरण दिया गया है कि एरे का उपयोग संकेत के साथ किया जाता है: 'd = 13; ई = 24; च = 35; ए = (डी ई एफ); echo $ {! a [1]} 'जिसके परिणामस्वरूप "24"। –

उत्तर

21

मैं पहले से ही एक प्रस्ताव मिला है, इस के द्वारा किया जा सकता है:

$ Aref=A$J 
$ echo ${!Aref} 
building 
$ Aref=A$J[1] 
$ echo ${!Aref} 
blocks 
$ Aref=A$J[@] 
$ echo "${!Aref}" 
building blocks 
+2

आप 'ए $ जे' कहने के लिए कैसे असाइन कर सकते हैं? आपको असाइन करने के विस्तार के बिना एक नाम की आवश्यकता है, लेकिन 'ए $ जे = (...)' काम नहीं करता है। – musiphil

+0

वह अक्षर "ए" है जिसके बाद वेरिएबल "जे" की सामग्री है। यदि जे == 2, तो आप इसे ए + $ {जे} == ए 2 –

+0

@ मुसिपिल, 'printf -v "ए $ जे"'% s '"असाइन करने के लिए मान" के रूप में देख सकते हैं। [BashFAQ # 6] देखें (http://mywiki.wooledge.org/BashFAQ/006)। –

17

यह ध्यान रखें, कि यहां तक ​​कि एक सूचकांक समय में प्रतिस्थापित किया जा जाएगा चर मूल्यांकन किया जाता है लायक है:

$ A2=(building blocks) 
$ Aref=A2[index] 
$ index=1 
$ echo "${!Aref}" 
blocks 
+2

** फ़ैंटस्टिक। ** वर्ष खोल स्क्रिप्टिंग + कम से कम एक दर्जन बार मैनुअल पढ़ना + * बिल्कुल इस पर स्पष्ट प्रयास * इस छोटे मणि की सतह पर असफल रहा! नोट, जैसे शाब्दिक इंडेक्स, ** कोई अंकगणितीय अभिव्यक्ति वैध है, जिसमें नेस्टेड विस्तार **, उदाहरण के लिए। 'चक्र = (0 1 2); रेफरी = 'चक्र [i ++% $ {# चक्र [*]}]'; $ {! ref} $ {! ref} $ {! ref} $ {! ref} $ {! ref} $ {! ref} # => 0 1 2 0 1 2' – anthonyrisinger

+0

मुझे आश्चर्य है कि यह स्पष्ट रूप से एक विशेषता है या नहीं ऐसा करने का इरादा है, या यदि हम अप्रत्यक्ष विस्तार के दुष्प्रभाव का शोषण कर रहे हैं, जो भविष्य में रिलीज से चुपचाप गायब हो सकता है। – davide

+0

@anthonyrisinger यह काफी दिलचस्प थाक्स :) –

2

आज (बैश 4.3 या उच्चतर के साथ), सबसे अच्छा अभ्यास nameref समर्थन का उपयोग करने के लिए है:

A1=(apple trees) 
A2=(building blocks) 
A3=(color television) 
J=2 

declare -n A="A$J" 
printf '%q\n' "${A[@]}" 

... होगा ठीक से फेंकना:

building 
blocks 

यह भी nameref A="A$J" ksh93 पर के रूप में उपलब्ध है। विवरण के लिए BashFAQ #6 देखें।

संबंधित मुद्दे