2008-09-17 15 views

答えて

45

bashはアレイをサポート:

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

これは配列要素がスペースや$ IFSの他のメンバーを含有することができるという利点を有します。別々の要素として正しく挿入されている限り、同じ方法で読み込まれます。

+0

DebianとMac OS Xのbashを使って、ここで別々の果物として「乾燥」と「マンゴー」印刷が行われています。これは私にとってIFSを守るものではありません。 :-( – emk

+0

emk、それは私の悪いです - 私はzshでテストしていましたが、bashではなく固定しました。 –

+0

これが動作することを確認できます。 – emk

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

'echo" $ i "'はループ内で - 引用符を使わずに、要素上でglob展開とIFS分割を行い、 'foo bar'を' foo bar'と同じにして '* .txt'をechoします文字列 '* .txt'を出力するのではなく、カレントディレクトリ内のすべての一致するファイルを検索します。 –

11

:あなたの果物の名前にスペースが含まれている場合、これは動作しません

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

注意してください。その場合は代わりにthis answerを参照してください。これは移植性はやや劣りますが、はるかに堅牢です。

+0

Mac OS XのBashでは、「do」の前にセミコロンか改行が必要です。 – emk

+0

はい、あなたの "do"が新しい行にない限り、セミコロンが必要です。また、$ IFSには、これが動作するためのスペースが必要です。 –

+0

は反復処理中のIFSに依存しています(単なる割り当てではありません)。不良なjujuであるため、この回答は最適ではありません。私がzshでテストしていたので、その後bashで修正されました。 –

6

正解として私が好きな答えが受け入れられたので、ここで別の話題に移ります:IFSを個人的な利益のために使う方法。 IFS変更は独自のサブプロセスに分離されるように、私は括弧内のコードを入れてきました:-P

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

。したがって、括弧で囲まれたセクションの最後には、IFSが元の値に戻されます。 (POSIXのSHとは異なり):-)

+0

'fruits =(apple orange" kiwi fruit ")'を試してみると、bashは "Kiwi"と "fruit"をループ中に別々のエンティティに分割します。あなたが/ inの場合、あなたはIFSによって焼かれます。しかし、 'echo $ {fruits [2]}は正しいことをします。これはうれしいことです。 – emk

+0

動作するこのコードのバージョンについては、http://stackoverflow.com/questions/78592/what-is-a-good-equivalent-to-perl-lists-in-bash#78631を参照してください。 – emk

+0

フィードバックありがとう!一定。 –

関連する問題