我有以下外壳代码:
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
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 中或在任何类似 Bourne 的 shell 中定义一个函数来避免这种情况,例如:
println() {
[ "$#" -eq 0 ] || printf '%s\n' "$@"
}