¿Imprimir elementos de matriz en líneas separadas en Bash?
¿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
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..."
(dondec
está el primer carácter deIFS
).
Casi siempre quieres "$@"
. Lo mismo ocurre con "${arr[@]}"
.
¡Cítelos siempre dos veces!
Simplemente cite el argumento para hacer eco:
(IFS=$'\n'; echo "${my_array[*]}")
el subshell ayuda a restaurar el IFS después de su uso
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[@]}"
Otra variante útil es canalizar a tr
:
echo "${my_array[@]}" | tr ' ' '\n'
Esto parece simple y compacto.
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