如何将 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

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 中或在任何类似 Bourne 的 shell 中定义一个函数来避免这种情况,例如:

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

相关内容