如何仅使用单个表达式分割命令的输出并将结果分配给数组?

如何仅使用单个表达式分割命令的输出并将结果分配给数组?

注意:我读过其他类似问题的答案(如何分割输出并将其存储在数组中?,如何在bash中将字符串拆分为数组),但他们都没有回答我在这里提出的具体问题。


假设某个命令的输出foo是由 10 个制表符分隔的字段组成的单行。然后

tmpvar=$( foo )
fields=( ${(ps:\t:)tmpvar} )
echo $#fields
# 10

问:如何foo在选项卡上实现相同的输出分割,而不需要中间分配tmpvar


FWIW,这不起作用:

fields=( ${(ps:\t:)$( foo )} )
echo $#fields
# 1

答案1

$ printf '<%s>\n' "${(@ps:\t:)$(printf 'foo bar\t\tbaz')}"
<foo bar>
<>
<baz>

或者,如果您确实想抑制空元素,如 tempvar 方法中所示:

$ printf '<%s>\n' ${(ps:\t:)"$(printf 'foo bar\t\tbaz')"}
<foo bar>
<baz>

IOW,您需要引用命令替换。否则,适用于命令替换的分割结果的字段的s:\t:连接(使用 的第一个字符)。$IFS$IFS

或者,您可以设置$IFS为空字符串或单个非空白字符。

$ (IFS=; printf '<%s>\n' ${(ps:\t:)$(printf 'foo bar\t\tbaz')})
<foo bar>
<baz>

答案2

您应该引用 $( foo )

fields=( ${(ps:\t:)"$( foo )"} )
echo $#fields

你可以找到这里有一些很好的例子

答案3

IFS=" "; set -f
a=( $(echo -e "a b\tc d") )
printf '<%s>\n' "size=${#a[@]}" "${a[@]}"

相关内容