¿Cómo puedo imprimir el elemento de la matriz de un Bash matriz en líneas separadas? Esto funciona, pero no hay duda de que es una mejor manera:

$ my_array=(one two three)
$ for i in ${my_array[@]}; do echo $i; done
one
two
three

Intentado esto pero no funciona:

$ IFS=$'\n' echo ${my_array[*]}
one two three

5 Comentarios

  1. 373

    Trata de hacer esto :

    $ printf '%s\n' "${my_array[@]}"

    La diferencia entre [email protected] y $*:

    • No cotizadas en bolsa, los resultados son indeterminadas. En Bash, expandir tanto para separar args
      y, a continuación, wordsplit y global.

    • Citado, "[email protected]" se expande cada elemento como un argumento separado, mientras que "$*"
      se expande a la args fusionado en un argumento: "$1c$2c..." (donde c es
      el primer carácter de IFS).

    Que casi siempre quieren "[email protected]". Lo mismo va para "${arr[@]}".

    Citar siempre ellos!

    • Y se nota, las comillas dobles alrededor de la variable de referencia son importantes si usted quiere asegurarse de que los elementos con los espacios interiores no son inadvertidamente se separaron.
    • no funciona, los elementos de la matriz terminan en una sola línea
    • Está usted seguro de que utiliza [@] y no [*]? Esto hace una diferencia.
    • tienes razón he utilizado [*] y no [@]. Funciona con [@], aunque estoy perplejo acerca de mi error: bastante seguro de que me copiar y pegar directamente desde sputnicks post.
    • ¿Cuáles son los dos guiones después de que el comando? Yo no se encontró ninguna referencias a él en el manual.
    • Significa : ‘fin de argumentos’.
    • Esta solución no funciona para mí, a pesar de usar un idéntico comando.
    • ‘no trabajo’ sin explicaciones y contexto es como hablar con una piedra y esperar a resolver su problema.
    • Supuse que dado que el contexto es un script de bash que se ejecutan en un entorno que apoya bash y printf, válido matriz con más de un elemento. Tal vez debería añadir que los elementos de la matriz son todas las rutas absolutas a los archivos? Pero eso no importa porque las tratan como cadenas.
    • Hay una manera de hacer lo que se emite ninguna línea en blanco si no hay elementos en la matriz sin tener que | grep -v '^$'?
    • [[ ${arr[@]} ]] && printf '%s\n' "${arr[@]}"
    • cómo acerca de dos matrices?
    • ¿qué es «printf ‘%s\n «» para?
    • es el formato para la función printf de la salida. %s significa un marcador de posición para un argumento de cadena (en este caso el elemento de la matriz) y \n añade un salto de línea después de eso. Por lo tanto, hay una cadena y un salto de línea en la salida de cada elemento de la matriz.
    • a=( 1 2 3 ); echo "${a[@]}" imprime 1 2 3. Estoy usando bash. Por qué no funciona para mí?

  2. 63

    Sólo cita el argumento de eco:

    ( IFS=$'\n'; echo "${my_array[*]}" )

    la capa sub ayuda a restaurar el IFS después de su uso

    • lo siento perreal, me mudé de mi marca de verificación para sputnick, a pesar de la simpatía de su solución mejor, porque he aprendido acerca de la ‘printf’ función.
    • Gracias por esta respuesta, me gusta! Lástima que las asignaciones de suceder después de la expansión, por lo IFS=$'\n' echo "${my_array[*]}" no funciona. Oh bien!
    • ¿qué entiende usted por «las asignaciones de suceder»?
    • He probado con Bash 4 — 4.4.23(1)-liberación — y funciona!
    • href=»https://www.gnu.org/software/bash/manual/html_node/Simple-Command-Expansion.html» >este – en mi ejemplo, bash guarda el IFS=... (vinculado #1), luego se expande "${my_array[*]}" (#2), luego cambios de IFS (#4). Como resultado, usted no puede hacer esto en uno de los comandos que necesita el cambio de IFS en primer lugar, por lo que necesita una subshell ( ... ) a menos que usted está dispuesto a cambiar de IFS en su actual consola.
    • No quería ver lo que estaba tratando de hacer allí. Creo que no funciona porque echo es un builtin en Bash. Sin embargo, se puede envolver en una función y funcionará! gist.github.com/steshaw/53ba0095bce8ccab52d26a14375dedb8
    • Me gusta la printf solución, aunque. No me había dado cuenta de que, como el manual de Bash señala, «El formato es reutilizado como necesario consumir todos los argumentos». Es un poco contradictorio para los programadores de C, sin embargo 😀.
    • buena idea, yo no había pensado en usar una función. No es porque echo es un builtin, aunque. Es porque la función en su esencia incluye la expansión, por lo que la expansión no ocurre hasta después de que se llama a la función, por lo que el punto de IFS ya se ha cambiado.
    • Bash es un poco desagradable, ¿no?

  3. 35

    Utilizando para:

    for each in "${alpha[@]}"
    do
      echo "$each"
    done

    Utilizando historia; nota: este va a fallar si los valores contienen !:

    history -p "${alpha[@]}"

    Utilizando basename; nota: este va a fallar si los valores contienen /:

    basename -a "${alpha[@]}"

    Utilizando shuf; tenga en cuenta que los resultados pueden no salir en orden:

    shuf -e "${alpha[@]}"
    • «shuf»… «no podría salir en orden»… hilarante.
    • para shuf. ¿Quién hubiera pensado usar ese?
    • echo "$each" …omg me muero XD
  4. 3

    Traté de que las respuestas aquí, en un gigante para…si bucle, pero no recibo ninguna alegría – así que lo hice como esta, tal vez desordenado pero hizo el trabajo:

     # EXP_LIST2 is iterated    
     # imagine a for loop
         EXP_LIST="List item"    
         EXP_LIST2="$EXP_LIST2 \n $EXP_LIST"
     done 
     echo -e $EXP_LIST2

    a pesar de que se agregó un espacio para la lista, que está muy bien – yo quería una pequeña sangría.
    También se presume el «\n» puede ser impreso en el original de $EP_LIST.

    • No tiene el aspecto de un ejemplo completo.
  5. 2

    Otra variante útil es la tubería a tr:

    echo "${my_array[@]}" | tr ' ' '\n'

    Esto parece simple y compacto

    • A excepción de esta forma se rompe en my_array=( "one two" three )
    • Se fija con comillas dobles.
    • No funciona como se anuncia en Bash versión 4+, tuvo que utilizar la echo "${my_array[@]}" | tr '' ' \n', aunque personalmente me gustaría evitar el uso de echo como eso, que tr mi elección, creo, algo así como tr '' ' \n' <<<"${my_array[@]}" podría ser un poco más fácil para leer más tarde.

Dejar respuesta

Please enter your comment!
Please enter your name here