次のシェルコードがあります。
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
//を使用すると、次のこともできますbash
。ksh93
array=()
for value in 10 5 27 33 14 25
do
array+=( "$(cmd "$value")" )
done
アレイを構築します。
その後、それらすべてで次のことを行います。
further-processing "${array[@]}"
配列のすべての要素をfuther-processing
orの引数として渡すには、次のようにします。
printf '%s\n' "${array[@]}" | further-processing
1行の各要素を印刷するには、次にパイプします。further-processing
ただし、配列が空の場合、空白行は印刷され続けます。 Bourneに似たシェルで関数を定義する代わりに、次のようにすることでこれを防ぐことができます。たとえば、次のようになりprint -rC1 --
ます。printf '%s\n'
zsh
println() {
[ "$#" -eq 0 ] || printf '%s\n' "$@"
}