web-dev-qa-db-ja.com

変数に格納されている複数行の文字列を反復する

readfor line in $(command)のようなものを書くのは悪いことですが、正しい方法は代わりに見えます:

command | while IFS= read -r line; do echo $line; done

これはうまくいきます。しかし、反復したいのがコマンドの直接の結果ではなく、変数の内容である場合はどうなりますか?

たとえば、次のファイルquickfoxを作成するとします。

The quick brown
foxjumps\ over -
the
lazy ,
dog.

私はこのようなことができるようになりたいです:

# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect
18
Jonathan H

Bashやzshのような最近のシェルでは、文字列を入力として受け入れる非常に便利な `<<< 'リダイレクタがあります。だからあなたは

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

それ以外の場合は、常に行うことができます

echo "$variable" | while IFS= read -r line ; do echo $line; done
22
lgeorget

複数行の値を持つ環境変数を反復する方法の例:

_for var in $(compgen -v | grep -Ev '^(BASH)'); do
    echo "$var=${!var}"
done
_

説明:

  1. $(compgen -v | grep -Ev '^(BASH)')-envのリストをgrep keysBASHで始まるものをスキップします
  2. _echo "$var=${!var}"_-印刷キー= ペア
0
FelikZ