forループの出力を変数に保存する方法

forループの出力を変数に保存する方法

次のシェルコードがあります。

for value in 10 5 27 33 14  25
do
      echo  $value
done

しかし、後で出力を操作したい場合はどうすればよいですか?出力全体を変数に保存したいと思います。可能ですか?

答え1

forループは他のコマンドと変わりません。コマンド置換を使用できます。

variable=$(
  for value in 10 5 27 33 14  25
  do
    echo "$value"
  done
)

出力全体から最後に追加された改行文字を引いた文字列をechoスカラー$variable変数に保存します。

これにより、次のことができます。

printf '%s\n' "$variable" | further-processing

または:

futher-processing << EOF
$variable
EOF

シェルでは、bash次を使用して各出力行を配列要素に保存することもできます。

readarray -t array < <(
  for value in 10 5 27 33 14  25
  do
    echo "$value"
  done
)

各スペース/タブ/改行を区切って保存します。言葉(デフォルトと仮定$IFS)配列として出力するには、Split + glob演算子を使用してglob部分を無効にできます。

set -o noglob # not needed in zsh which does only split upon unquoted
              # command substitution. zsh also splits on NULs by default
              # whilst other shells either removes them or choke on them.
array=(
  $(
    for value in 10 5 27 33 14  25
    do
      echo "$value"
    done
  )
)

zsh//を使用すると、次のこともできますbashksh93

array=()
for value in 10 5 27 33 14 25
do
  array+=( "$(cmd "$value")" )
done

アレイを構築します。

その後、それらすべてで次のことを行います。

further-processing "${array[@]}"

配列のすべての要素をfuther-processingorの引数として渡すには、次のようにします。

printf '%s\n' "${array[@]}" | further-processing

1行の各要素を印刷するには、次にパイプします。further-processing

ただし、配列が空の場合、空白行は印刷され続けます。 Bourneに似たシェルで関数を定義する代わりに、次のようにすることでこれを防ぐことができます。たとえば、次のようになりprint -rC1 --ます。printf '%s\n'zsh

println() {
  [ "$#" -eq 0 ] || printf '%s\n' "$@"
}

関連情報