Как разделить вывод команды и присвоить результат массиву, используя только одно выражение?

Как разделить вывод команды и присвоить результат массиву, используя только одно выражение?

Примечание:Я прочитал ответы на другие похожие вопросы (Как разделить вывод и сохранить его в массиве?,Как разделить строку на массив в bash), но ни один из них не отвечает на конкретный вопрос, который я здесь задаю.


Предположим, что вывод некоторой команды fooпредставляет собой одну строку, состоящую из 10 полей, разделенных табуляцией. Тогда

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

В:Как можно добиться такого же разделения fooвывода на вкладках без необходимости промежуточного назначения tmpvar?


Кстати, это не работает:

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[@]}"

Связанный контент