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
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!
Il suffit de citer l'argument pour faire écho:
( IFS=$'\n'; echo "${my_array[*]}" )
le sous-shell aide à restaurer l'IFS après utilisation
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[@]}"
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.
Une autre variante utile est de diriger vers tr
:
echo "${my_array[@]}" | tr ' ' '\n'
Cela a l'air simple et compact