14

複数行のスクリプト変数があります。この変数をトラバースして行ごとに読み取り、各行を希望どおりに処理するにはどうすればよいですか?

4

2 に答える 2

34

次の複数行の変数を検討してください

x=$(echo -e "a\nb\nc d e")

各行の簡単なプロセス: echoprefix=LINE:を使用し、行を一重引用符で囲むだけです。次のコードのいずれかがその要件を満たします。

while read line; do echo "LINE: '${line}'"; done <<< "$x"

また

while read line; do echo "LINE: '${line}'"; done < <(echo "$x")

どちらもサブシェルを作成せず (たとえば、ループ内で変数を設定し、ループ外でそれらにアクセスすることができます)、両方とも出力します。

LINE: 'a'
LINE: 'b'
LINE: 'c d e'

しかし、代わりにあなたが持っているとしましょう

x=$(echo -e "a \n b\nc d e")
# note--------^--^

そして、その先頭と末尾の空白はアプリケーションにとって重要です (例: Git 磁器の解析)。上記のコードは両方とも、後者の変数/データに対して前者とまったく同じ出力を提供しますが、これはあなたが望むものではありません。先頭と末尾の空白を保持するにはwhile read linewhile IFS= read -r line. つまり、次のコードのいずれか

while IFS= read -r line; do echo "LINE: '${line}'"; done <<< "$x"

また

while IFS= read -r line; do echo "LINE: '${line}'"; done < <(echo "$x")

生産します

LINE: 'a '
LINE: ' b'
LINE: 'c d e'

詳細については、 Greg Wooledge の優れた Bash FAQを参照してください。

于 2012-08-10T13:02:26.460 に答える