Shell

如何將 for 循環的輸出儲存到變數中

  • June 27, 2022

我有以下外殼程式碼:

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

bashshell 中,您還可以將輸出的每一行儲存到數組的一個元素中:

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-processingor:

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

要將每個元素列印在一行上,通過管道傳送到further-processing

但是請注意,如果數組為空,則仍會列印空行。您可以通過使用print -rC1 --而不是printf '%s\n'zsh任何類似 Bourne 的 shell 中來避免這種情況,定義一個函式,例如:

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

引用自:https://unix.stackexchange.com/questions/707665