2008-09-17 82 views

回答

45

bash的(不像POSIX SH)支持阵列:

fruits=(apple orange kiwi "dried mango") 
for fruit in "${fruits[@]}"; do 
    echo "${fruit}" 
done 

这具有数组元素可能包含空格或$ IFS其他成员的优点;只要将它们作为单独的元素正确插入,就可以以相同的方式读出它们。

4
 
for i in apple orange kiwi 
do 
    echo $i 
done 
+0

`echo“$ i”`在循环中 - 没有引号,这会在元素上进行glob扩展和IFS分割,使得`foo bar`与`foo bar`相同,并使`* .txt`回声当前目录中的所有匹配文件,而不是发出文字“* .txt”。 – 2011-07-03 23:24:28

11

像这样:

FRUITS="apple orange kiwi" 
for FRUIT in $FRUITS; do 
    echo $FRUIT 
done 

注意是否有你的水果的名称空间,这将无法正常工作。在这种情况下,请参见this answer,它的便携性稍差,但更健壮。

+0

在Mac OS X上的Bash中,我似乎需要在“做”之前使用分号或换行符。 – emk 2008-09-17 00:22:59

+0

是的,除非你的“do”在新行上,否则你确实需要分号。此外,$ IFS必须包含一个空间来运作。 – 2008-09-17 00:24:30

+0

取决于迭代期间的IFS(而不仅仅是赋值)是不好的juju,使得这个回答并不理想。当然,我的也是 - 我在zsh上进行测试,因为bash被固定。 – 2008-09-17 00:39:56

6

既然我喜欢的答案已被接受为正确答案,那么现在我将转入另一个主题:如何使用IFS来获得个人收益。 :-P

fruits="apple,orange,kiwifruit,dried mango" 
(IFS=, 
for fruit in $fruits; do 
    echo "$fruit" 
done) 

我已经把括号中的代码,以便IFS变化被隔离到它自己的子进程;因此在方括号部分的末尾,IFS被恢复为其旧值。 :-)

相关问题