¿Imprimir elementos de matriz en líneas separadas en Bash?

Resuelto Axel Bregnsbo asked hace 11 años • 8 respuestas

¿Cómo imprimo el elemento de matriz de una matriz Bash en líneas separadas? Éste funciona, pero seguramente hay una manera mejor:

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

Probé este pero no funcionó:

$ IFS=$'\n' echo ${my_array[*]}
one two three
Axel Bregnsbo avatar Mar 29 '13 03:03 Axel Bregnsbo
Aceptado

Intenta hacer esto:

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

La diferencia entre $@y $*:

  • Sin comillas, los resultados no se especifican. En Bash, ambos se expanden para separar argumentos y luego dividen las palabras y las agrupan.

  • Citado, "$@"expande cada elemento como un argumento separado, mientras que "$*" se expande a los argumentos fusionados en un argumento: "$1c$2c..."(donde cestá el primer carácter de IFS).

Casi siempre quieres "$@". Lo mismo ocurre con "${arr[@]}".

¡Cítelos siempre dos veces!

Gilles Quénot avatar Mar 28 '2013 20:03 Gilles Quénot

Simplemente cite el argumento para hacer eco:

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

el subshell ayuda a restaurar el IFS después de su uso

perreal avatar Mar 28 '2013 21:03 perreal

Usando para :

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

Usando la historia ; tenga en cuenta que esto fallará si sus valores contienen !:

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

Usando nombre base ; tenga en cuenta que esto fallará si sus valores contienen /:

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

Usando shuf ; tenga en cuenta que es posible que los resultados no aparezcan en orden:

shuf -e "${alpha[@]}"
Zombo avatar May 20 '2015 02:05 Zombo

Otra variante útil es canalizar a tr:

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

Esto parece simple y compacto.

0x00 avatar Feb 04 '2017 00:02 0x00

Podrías usar un Bash C Style For Loop para hacer lo que quieras.

my_array=(one two three)

for ((i=0; i < ${#my_array[@]}; i++ )); do echo "${my_array[$i]}"; done
one
two
three
Delyan Lazarov avatar Feb 06 '2021 21:02 Delyan Lazarov