2008-09-17 66 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被恢復爲其舊值。 :-)

相關問題