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 Comentarios

  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.

Dejar respuesta

Please enter your comment!
Please enter your name here