2012-06-04 197 views
14

我在ZSH中工作,但我確定BASH指令可能也有幫助。我需要一個for循環,通過存儲在數組lw中的值,然後根據存儲在數組中的名稱啓動一個shell腳本。ZSH for循環數組變量問題

到目前爲止,這是我想出來的:

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

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

運行說,它不能找到〜/資源庫/ Rogall /插件// LW時,它只是給我一個錯誤。 prg,所以它似乎忽略了我所有的變量。

任何想法,我已經搞砸了?

+1

嘗試'回聲$ i'看什麼它包含。 –

回答

26

它實際上比這更簡單的多:

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

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

總結:

  • 分配到 「富」,而不是 「$ FOO」(殼會嘗試展開$ foo和分配給無論它展開到什麼程度;通常不會有用)
  • 直接使用循環變量;它包含數組而不是指數
+0

這很有道理!謝謝! – user1296965

+0

或者僅僅爲了我($ lw)。 〜/ Library/Rogall/plugins/$ i/lw.prg end' –

+1

在一般情況下,'for i in $ array'會跳過空元素。你需要在$ {array [@]「'​​或'for $ in'in'$ {(@)array}中爲我保留空的(或者兼容ksh/bash的語法:'for i in 「$ {陣列[@]}」')。 –

13

何必使用數組?這可以在便攜式SH做很容易:

lw='plugin1 plugin2 plugin3' 

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

請注意,這在zsh的工作,你需要做的zsh做正確的事情有:set -o shwordsplit

+0

即使很刺耳。謝謝。 – user1296965

+1

並不是所有的東西都是可移植的,特別是如果要在Mac上運行(通過目錄名稱來判斷)。此外,您的解決方案在每個單詞中可能存在空格的通用情況下失敗。 –

+0

@Moritz這不是一般情況,而是一個特殊的情況,其中文件名中沒有空格。可移植性可能並不總是必要的,但它始終是一個理想的目標。這個解決方案在Mac上運行得很好。 –