Dans une boucle sur un tableau, ajoutez un élément au tableau

9

J'ai un problème avec la boucle for dans bash. Par exemple: j'ai un tableau ("etc" "bin" "var"). Et j'itère sur ce tableau. Mais dans la boucle, j'aimerais ajouter une valeur au tableau. Par exemple

array=("etc" "bin" "var")
for i in "${array[@]}"
do
echo $i
done

Cela s'affiche etc bin var(bien sûr sur des lignes distinctes). Et si j'ajoute après docomme ça:

array=("etc" "bin" "var")
for i in "${array[@]}"
do
array+=("sbin")
echo $i
done

Je veux: etc bin var sbin(bien sûr sur des lignes distinctes).

Ça ne marche pas. Comment puis-je le faire?

damekr
la source
1
Modifier la chose que vous répétez est toujours une proposition risquée. C'est souvent le bon moment pour prendre du recul et voir s'il y a une autre approche qui pourrait avoir du sens
Eric Renouf

Réponses:

6

Il va ajouter « sbin » 3 fois comme il se doit, mais il ne sera pas sur la nouvelle itérer ajoutée « sbin » s dans la même boucle.

Après le 2ème exemple:

echo "${array[@]}"
#=> etc bin var sbin sbin sbin
PSkocik
la source
Oui, c'est vrai, mais j'ai besoin d'ajouter à la même boucle :)
damekr
Utilisez ensuite deux forboucles. Effectuez d'abord vos ajouts, puis parcourez le résultat.
PSkocik
1
Je ne vois pas pourquoi vous voudriez ajouter sbin dans la boucle. L'ajouter une seule fois a plus de sens:array+=(sbin); for i in ...
PSkocik
parce que dans la boucle, je dois vérifier si certains fichiers qui sont copiés par cette boucle ont du contenu ..
damekr
5
set etc bin var
while [ "$#" -gt 1 ]
do    [ "$1" = bin ] &&
      set "$@" sbin
      printf %s\\n "$1"
shift;done 

Cela itérera sur votre liste, clouera sbinla fin de ladite liste de manière conditionnelle et l'inclura sbindans le contenu itérable.

mikeserv
la source