2012-06-04 72 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上运行得很好。 –