¿Cómo dividir la salida del comando y asignar el resultado a una matriz usando una sola expresión?

¿Cómo dividir la salida del comando y asignar el resultado a una matriz usando una sola expresión?

NÓTESE BIEN:He leído las respuestas a otras preguntas similares (¿Cómo dividir la salida y almacenarla en una matriz?,Cómo dividir una cadena en una matriz en bash), pero ninguno de ellos responde a la pregunta específica que hago aquí.


Supongamos que la salida de algún comando fooes una sola línea que consta de 10 campos separados por tabulaciones. Entonces

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

P:¿Cómo puedo lograr la misma división de foola salida en pestañas sin necesidad de una asignación intermedia tmpvar?


FWIW, esto no funciona:

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

Respuesta1

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

O si desea suprimir los elementos vacíos como en su enfoque tempvar:

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

OIA, debes citar la sustitución del comando. De lo contrario, s:\t:se aplica a la unión (con el primer carácter de $IFS) de los campos resultantes de la $IFSdivisión de la sustitución del comando.

Alternativamente, puede configurar $IFSla cadena vacía o un único carácter que no sea un espacio en blanco.

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

Respuesta2

Debes citar el $( foo )

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

Puedes encontraraquí algunos buenos ejemplos

Respuesta3

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

información relacionada