私 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
Bashやzshのような最近のシェルでは、文字列を入力として受け入れる非常に便利な `<<< 'リダイレクタがあります。だからあなたは
while IFS= read -r line ; do echo $line; done <<< "$variable"
それ以外の場合は、常に行うことができます
echo "$variable" | while IFS= read -r line ; do echo $line; done
複数行の値を持つ環境変数を反復する方法の例:
_for var in $(compgen -v | grep -Ev '^(BASH)'); do
echo "$var=${!var}"
done
_
説明:
$(compgen -v | grep -Ev '^(BASH)')
-envのリストをgrep keys、BASH
で始まるものをスキップしますecho "$var=${!var}"
_-印刷キー= 値ペア