bash imprimer les éléments du tableau sur des lignes séparées
Comment puis-je imprimer l'élément du tableau est un tableau Bash sur des lignes distinctes? Celui-ci fonctionne, mais il y a sûrement un meilleur moyen:
$ my_array=(one two three)
$ for i in ${my_array[@]}; do echo $i; done
one
two
three
Essayé ceci mais ça ne fonctionne pas:
$ IFS=$'\n' echo ${my_array[*]}
one two three
Vous devez vous connecter pour publier un commentaire.
Essayez de faire cela :
La différence entre
$@
et$*
:Non cotées, les résultats ne sont pas spécifiés. En Bash, les deux développez pour séparer les arguments
et puis wordsplit et globbed.
Cité,
"$@"
élargit chaque élément comme un argument séparé, tandis que"$*"
développe la args fusionnés en un seul argument:
"$1c$2c..."
(oùc
estle premier char de
IFS
).Vous veulent presque toujours
"$@"
. En va de même pour"${arr[@]}"
.Toujours citer!
[@]
et pas[*]
? Cela fait une différence.[*]
et pas[@]
. Il fonctionne avec[@]
, même si je suis perplexe à propos de mon erreur: assez sûr que je copie-collé directement à partir de sputnicks post.| grep -v '^$'
?[[ ${arr[@]} ]] && printf '%s\n' "${arr[@]}"
a=( 1 2 3 ); echo "${a[@]}"
imprime1 2 3
. Je suis en utilisant bash. Pourquoi ne pas travailler pour moi?De citer l'argument de l'écho:
le sous-shell permet de restaurer les IFS après utilisation
IFS=$'\n' echo "${my_array[*]}"
ne fonctionne pas. Oh bien!IFS=...
(lien n ° 1), puis se développe"${my_array[*]}"
(#2), puis changementsIFS
(#4). En conséquence, vous ne pouvez pas le faire en une seule commande - vous besoin de l'IFS changer d'abord, si vous avez besoin d'un shell interne est exécuté( ... )
, sauf si vous êtes prêt à changer FI dans votre shell courant.echo
est un builtin dans Bash. Cependant, vous pouvez l'envelopper dans une fonction, et il va fonctionner! gist.github.com/steshaw/53ba0095bce8ccab52d26a14375dedb8printf
solution si. Je n'avais pas réalisé que, comme le manuel de Bash le souligne, "Le format est réutilisé comme nécessaires pour consommer tous les arguments". C'est un peu contre-intuitif pour les programmeurs C, cependant .echo
est un builtin, cependant. C'est parce que la fonction dans votre gist inclut l'expansion, l'expansion ne se produit pas jusqu'à ce que une fois que la fonction est appelée, par laquelle le point deIFS
a déjà été changé.À l'aide de pour:
À l'aide de histoire; à noter que ceci ne fonctionnera pas si vos valeurs contiennent
!
:À l'aide de basename; à noter que ceci ne fonctionnera pas si vos valeurs contiennent
/
:À l'aide de shuf; note que les résultats ne sont pas dans l'ordre:
J'ai essayé les réponses ici dans un géant pour...si la boucle, mais n'a pas obtenu toute la joie - j'ai donc fait comme cela, peut-être compliqué, mais a fait le job:
bien que l'ajout d'un espace à la liste, ce qui est bien - je l'ai voulu un peu en retrait.
Aussi présumer que le "\n" pourrait être imprimé dans l'original $EP_LIST.
Une autre variante utile est un tuyau à
tr
:echo "${my_array[@]}" | tr ' ' '\n'
Cela a l'air simple et compact
my_array=( "one two" three )
4
+, il fallait utiliserecho "${my_array[@]}" | tr '' ' \n'
, bien que personnellement je préfère éviter d'utiliserecho
comme ça, oùtr
mon choix je pense que quelque chose commetr '' ' \n' <<<"${my_array[@]}"
peut-être un peu plus facile à lire plus tard.