在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