Shell
如何將 for 循環的輸出儲存到變數中
我有以下外殼程式碼:
for value in 10 5 27 33 14 25 do echo $value done
但是如果我想稍後操作輸出怎麼辦?我想將整個輸出儲存在一個變數中。這可能嗎?
循環與任何其他命令沒有什麼不同
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
shell 中,您還可以將輸出的每一行儲存到數組的一個元素中: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
要將每個元素列印在一行上,通過管道傳送到
further-processing
但是請注意,如果數組為空,則仍會列印空行。您可以通過使用
print -rC1 --
而不是printf '%s\n'
在zsh
任何類似 Bourne 的 shell 中來避免這種情況,定義一個函式,例如:println() { [ "$#" -eq 0 ] || printf '%s\n' "$@" }