Cómo inicializar un bash matriz con salida de corriente de otro comando?

Hay alguna forma de canalizar la salida de un comando que muestra un montón de números (cada número en una línea separada) e inicializar un bash array con los números?

Detalles:
Esta es una lista de 3 changelist números que se han presentado en el siguiente rango de fecha. La salida se transfiere a cut para filtrar además para obtener el changelist números.

p4 changes -m 3 -u edk -s submitted @2009/05/01,@now | cut -d ' ' -f 2

E. g. :

422311
543210
444000

¿Cómo es posible guardar esta lista en una fiesta de la matriz?

InformationsquelleAutor vivekian2 | 2009-06-09

3 Kommentare

  1. 56

    Puede ejecutar el comando en virtud de las garrapatas y el conjunto de la Matriz como,

    ARRAY=(`command`)

    Alternativamente, usted puede guardar la salida del comando a un archivo, y el gato de manera similar,

    command > file.txt
    ARRAY=(`cat file.txt`)

    O, simplemente, una de las formas siguientes sugerido en los comentarios de abajo,

    ARRAY=(`< file.txt`)
    ARRAY=($(<file.txt))
    • Inútil el uso de gato: <file.txt hace lo mismo.
    • +1 @ephemient, tienes razón en eso.
    • fija la respuesta para referencia en el futuro.
    • Siempre que sea posible, evitar el uso de ofertas de espera. Esto es más legible y puede trabajar con la anidación sin torpe citando a: ARRAY=($(comando)) o=ARRAY($(< file.txt))
    • si la salida del comando tiene espacios, estás de suerte
    • Se advierte que este será SIEMPRE el uso de espacios en blanco para separar los elementos. stackoverflow.com/questions/9449417/… informes posibilidad de manejar el espacio en blanco mediante el establecimiento de IFS a '\n' pero no podía hacer que se acepte '\0'.

  2. 9

    Si utiliza bash 4+, ha comando especial para esto: mapfile también conocido como readarray, así que usted puede llenar su matriz como esta:

    declare -a a
    readarray -t a < <(command)

    para obtener más versión portátil que usted puede utilizar

    declare -a a
    while read i; do
      a=( "${a[@]}" "$i" )
    done < <(command)
    • Esta es mi primera vez viendo < <(command). Puede usted por favor me ayuden a encontrar más detalle sobre esta sintaxis. Estoy interesado en saber por qué se necesita 2 < a trabajar. Gracias
    • Primera < es la redirección del flujo de entrada, consulte gnu.org/software/bash/manual/html_node/… por lo detiene. Construcción <(command) significa que la salida de command se canaliza al llamado fifo (generalmente /dev/fdn), los detalles se pueden encontrar en gnu.org/software/bash/manual/html_node/….
    • Se advierte que readarray no admite una alternativa separador, siempre se utiliza el salto de línea.
    • a[${#a[*]}]=value o a+=(value) es una mejor sintaxis para agregar a una matriz.
    • Re @ivan_pozdeev readarray/mapfile al parecer no admite la definición de alternativas de delimitadores. El docs especificar -d delim: «El primer carácter de delim se utiliza para terminar cada línea de entrada, en lugar de salto de línea.»
    • para readarray que es nuevo en bash 4.4.
    • Ah OK, gracias @ivan.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea