web-dev-qa-db-fra.com

bash print array array sur des lignes séparées

Comment imprimer l'élément de tableau d'un tableau de Bash sur des lignes séparées? Celui-ci fonctionne, mais il existe sûrement un meilleur moyen:

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

J'ai essayé celui-ci mais cela n'a pas fonctionné:

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

Essayez de faire ceci:

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

La différence entre $@ et $*:

  • Non cité, les résultats ne sont pas spécifiés. Dans Bash, les deux développent pour séparer les arguments, puis wordsplit et globbed.

  • Cité, "$@" développe chaque élément en tant qu'argument séparé, tandis que "$*" s'étend aux arguments fusionnés en un seul argument: "$1c$2c..." (où c est le premier caractère de IFS).

Vous voulez presque toujours "$@". Il en va de même pour "${arr[@]}".

citez-les toujours!

372
Gilles Quenot

Il suffit de citer l'argument pour faire écho:

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

le sous-shell aide à restaurer l'IFS après utilisation

63
perreal

Utiliser for:

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

Utilisation de historique; notez que cela échouera si vos valeurs contiennent !:

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

Utiliser nom de base; notez que cela échouera si vos valeurs contiennent /:

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

Utiliser shuf; notez que les résultats risquent de ne pas apparaître dans l'ordre:

shuf -e "${alpha[@]}"
34
Steven Penny

J'ai essayé les réponses ici dans un géant pour ... si boucle, mais je n'ai pas eu de joie - alors je l'ai fait comme ça, peut-être en désordre, mais j'ai fait le travail:

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

bien que cela ait ajouté un espace à la liste, ce qui est bien - je le voulais un peu en retrait. Supposons également que le "\ n" puisse être imprimé dans l'original $ EP_LIST.

3
wuxmedia

Une autre variante utile est de diriger vers tr:

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

Cela a l'air simple et compact

2
0x00