在perl的人会简单地做下面的存储和迭代名什么是在bash中与Perl列表相当的好东西?
my @fruit = (apple, orange, kiwi);
foreach (@fruit) {
print $_;
}
就相当于是什么在bash的名单?
在perl的人会简单地做下面的存储和迭代名什么是在bash中与Perl列表相当的好东西?
my @fruit = (apple, orange, kiwi);
foreach (@fruit) {
print $_;
}
就相当于是什么在bash的名单?
bash的(不像POSIX SH)支持阵列:
fruits=(apple orange kiwi "dried mango")
for fruit in "${fruits[@]}"; do
echo "${fruit}"
done
这具有数组元素可能包含空格或$ IFS其他成员的优点;只要将它们作为单独的元素正确插入,就可以以相同的方式读出它们。
for i in apple orange kiwi do echo $i done
像这样:
FRUITS="apple orange kiwi"
for FRUIT in $FRUITS; do
echo $FRUIT
done
注意是否有你的水果的名称空间,这将无法正常工作。在这种情况下,请参见this answer,它的便携性稍差,但更健壮。
在Mac OS X上的Bash中,我似乎需要在“做”之前使用分号或换行符。 – emk 2008-09-17 00:22:59
是的,除非你的“do”在新行上,否则你确实需要分号。此外,$ IFS必须包含一个空间来运作。 – 2008-09-17 00:24:30
取决于迭代期间的IFS(而不仅仅是赋值)是不好的juju,使得这个回答并不理想。当然,我的也是 - 我在zsh上进行测试,因为bash被固定。 – 2008-09-17 00:39:56
既然我喜欢的答案已被接受为正确答案,那么现在我将转入另一个主题:如何使用IFS
来获得个人收益。 :-P
fruits="apple,orange,kiwifruit,dried mango"
(IFS=,
for fruit in $fruits; do
echo "$fruit"
done)
我已经把括号中的代码,以便IFS
变化被隔离到它自己的子进程;因此在方括号部分的末尾,IFS
被恢复为其旧值。 :-)
`echo“$ i”`在循环中 - 没有引号,这会在元素上进行glob扩展和IFS分割,使得`foo bar`与`foo bar`相同,并使`* .txt`回声当前目录中的所有匹配文件,而不是发出文字“* .txt”。 – 2011-07-03 23:24:28