2012-10-29 11 views
28

while read lineで変数から読み込む方法はありますか?例えばwhileループで変数を読み込むにはどうすればいいですか

:上記のコードを使用して

the_list=$(..code..) 

while read line 
do 
     echo $line 

done < $the_list 

は私にエラーを与える:

あなたが実行whileループを気にしない場合は、ちょうど

your_code | while read line; 
do 
    echo $line 
done 

を使用することができます

./copy.sh: line 25: $the_list: ambiguous redirect 

答えて

48

あなたは書くことができます。

while IFS= read -r line 
do 
    echo "$line" 
done <<< "$the_list" 

§3.6.7 "Here Strings" in the Bash Reference Manualを参照してください。

(私もあなたの変数の内容と周りいじくるすぎを避けるために、いくつかの二重引用符を追加し、read-rIFS=を追加することの自由を取った。)

+2

'IFS ='はIFSをヌル文字に設定しますか?この場合、なぜあなたはそれを必要としますか? – doubleDown

+6

@doubleDown: 'IFS ='は '$ IFS'を空文字列に設定します(したがって、文字はまったく含まれません)。この場合、1つのフィールドしかないので、行の先頭から先行するIFS文字の除去を防ぐことが唯一の効果です。 (私が何を意味するかを見るには、 'read foo <<< 'bar';' 'foo' 'を' IFS = read foo <<< 'bar'; echo "$ foo" 'と比較してください) – ruakh

15

(あなたが変更する変数は、doneの後に親には表示されません)。

+0

優秀!どうもありがとう! –

22

をあなたが使用していない場合それ以外の変数は、あなたがそれなしでも行うことができます:

while read line ; do 
    echo $line 
done < <(... code ...) 
-1

スクリプトファイルはLinuxモードでなければなりません。以前はdosモードでした。 dos2unix filenameを使って変更しました。

例えば:

dos2unix sshcopy.sh 

今では私のために動作します。

+0

[ruakh](http://stackoverflow.com/a/13122491/622391)は尋問者に受け入れられました。これは、問題がスクリプトのファイル形式に関連していないことを意味します。 –

関連する問題