2012-06-04 16 views
14

मैं जेडएसएच में काम कर रहा हूं, लेकिन मुझे यकीन है कि बाश निर्देश शायद मदद भी करेंगे। मुझे एक लूप होना चाहिए जो सरणी lw में संग्रहीत मानों के माध्यम से जाता है और फिर सरणी में संग्रहीत नाम के आधार पर एक शेल स्क्रिप्ट लॉन्च करता है।लूप एरे परिवर्तनीय समस्या के लिए ZSH

$lw=('plugin1' 'plugin2' 'plugin3') 

for i in $lw; 
    do . ~/Library/Rogall/plugins/$lw[$i]/lw.prg end; 
done 

यह सिर्फ जब कह रही है कि यह नहीं मिल सकता है ~/Library/Rogall/plugins // LW चलाने मुझे एक त्रुटि देता है:

अब तक, यह है कि क्या मैं के साथ आ गया है। prg, तो ऐसा लगता है कि यह सिर्फ मेरे चर सभी को अनदेखा कर रहा है।

कोई विचार जहां मैंने गड़बड़ की है?

+1

प्रयास करें 'गूंज $ मैं' घ क्या देखने के लिए इसमें शामिल है। –

उत्तर

26

यह वास्तव में बहुत बड़ा आसान है:

lw=('plugin1' 'plugin2' 'plugin3') 

for i in $lw; do 
    . ~/Library/Rogall/plugins/$i/lw.prg end 
done 

सारांश में:

  • आवंटित करने के लिए "foo" नहीं "$ foo" (खोल $ foo विस्तार करने के लिए कोशिश करते हैं और करने के लिए आवंटित होगा जो कुछ भी फैलता है, आम तौर पर उपयोगी नहीं)
  • सीधे लूप चर का उपयोग करें; यह सरणी मूल्य बजाय सूचकांक
+0

यह इतना समझ में आता है! धन्यवाद! – user1296965

+0

या सिर्फ 'i ($ lw) के लिए। ~/लाइब्रेरी/रोज़ल/प्लगइन्स/$ i/lw.prg end' –

+1

सामान्य स्थिति में, 'मैं $ array में' के लिए खाली तत्वों को छोड़ दूंगा। रिक्त वाले (या केश/बैश-संगत वाक्यविन्यास: 'के लिए आपको "$ {(@)"} में "i {i" के लिए "$ {(@)"' या 'i ' "$ {सरणी [@]}" ')। –

13

क्यों सरणी का उपयोग कर परेशान होते हैं? यह पोर्टेबल श में किया जा सकता बहुत आसानी से:

lw='plugin1 plugin2 plugin3' 

for i in $lw; 
    do . ~/Library/Rogall/plugins/$i/lw.prg end 
done 

ध्यान दें कि यह zsh में काम करने के लिए, आप zsh साथ सही काम करने की जरूरत है: set -o shwordsplit

+0

यहां तक ​​कि spiffier। धन्यवाद। – user1296965

+1

सबकुछ पोर्टेबल के रूप में होने के बारे में नहीं है, विशेष रूप से यदि यह मैक पर चलाना है (निर्देशिका नामों के आधार पर)। इसके अलावा आपका समाधान सामान्य मामले के लिए विफल रहता है जिसमें प्रत्येक शब्द में रिक्त स्थान हो सकते हैं। –

+0

@ मॉरिट्स यह एक सामान्य मामला नहीं है, लेकिन एक विशिष्ट मामला जिसमें फ़ाइल नामों में कोई स्थान नहीं है। पोर्टेबिलिटी हमेशा जरूरी नहीं हो सकती है, लेकिन यह हमेशा एक वांछनीय लक्ष्य है। और यह समाधान मैक पर बस ठीक काम करता है। –

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