# (bash) petit souci avec un tableau

**URL:** <https://www.debian-fr.org/t/bash-petit-souci-avec-un-tableau/28332>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 11:16 UTC](https://www.debian-fr.org/t/bash-petit-souci-avec-un-tableau/28332 "2016-02-20T23:16:33Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![lrgtk](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/67e7ee/32.png) [@lrgtk](https://www.debian-fr.org/u/lrgtk)\
**Post date:** [Février 20, 2016, 11:16 UTC](https://www.debian-fr.org/t/bash-petit-souci-avec-un-tableau/28332/1 "2016-02-20T23:16:33Z")

</div>

bonjour

plutot qu’un long discours:

`	read chemin
	cd $chemin
	i='0'
	declare -a cheminnamefile
	find $chemin -type f -name '*.xxx' | while read linex;
	do 
		cheminnamefile[$i]=$linex
		echo "$i - ${cheminnamefile[i]}"
		i=$((i+1))
	done 
	echo "${cheminnamefile[*]}"
`  
resulat :

[code]0 - /home/nc/java/test1.xxx  
1 - /home/nc/java/test2.xxx  
2 - /home/nc/java/test5.xxx  
3 - /home/nc/java/test3.xxx  
4 - /home/nc/java/test4.xxx  
5 - /home/nc/java/test0.xxx

[/code]

le probleme, sortie de la boucle mon tableau est vide, j’ai vue sur le net qu’une boucle est une sorte de sous shell, mais pas trouver comment faire pour que mon tableau soit entre"" global

merci d’avance pour votre aide

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 20, 2016, 11:16 UTC](https://www.debian-fr.org/t/bash-petit-souci-avec-un-tableau/28332/2 "2016-02-20T23:16:37Z")

</div>

Bonjour,

C’est tout à fait normal. l’utilisation du pipe implique la création d’un processus fils. les variables valorisées au sein de ce processus n’y ont qu’une portée locale.

Pour contourner cela, il faut utiliser la substitution de processus (je te renvoie au man bash pour plus de détail).

Mais voilà ce que ça donne :

```auto
read chemin
cd $chemin
i='0'
declare -a cheminnamefile
while read linex;
do
      cheminnamefile[$i]=$linex
      echo "$i - ${cheminnamefile[i]}"
      i=$((i+1))
done < <(find $chemin -type f -name '*.xxx')
echo "${cheminnamefile[*]}"
```

Par rapport à ton script : 2 points d’amélioration :

1. Ne pas préciser de nom de variable à read. Cela évite la perte d’information  
Je te laisse faire ce test pour comprendre…

```auto
read variable <<< " a b c "
echo "-${variable}-"
read <<< " a b c "
echo "-${REPLY}-"
```

Certe, il est peut probable qu’il y ait des blancs en début et/ou fin de nom de dossier/fichier.

1. La constitution de ton tableau : pas besoin d’indice  
Il est possible d’ajouter des éléments à un tableau sans connaitre le nombre d’éléments du tableau via la notation tableau+= ( valeur )

Ton script :

```auto
read
chemin="${REPLY}" 
cd "${chemin}"
declare -a cheminnamefile
while read
do
      cheminnamefile+= ( "${REPLY}" )
      echo "$((${#cheminnamefile[@]}-1)) - ${cheminnamefile[((${#cheminnamefile[@]}-1))]}"
done < <(find "${chemin}" -type f -name '*.xxx')
printf "%s\n" "${cheminnamefile[@]}"
```

Maintenant, si ta boucle a juste pour objectif de constituer ton tableau, tu peux procéder ainsi :

```auto
read
chemin="${REPLY}" 
cd "${chemin}"
IFS=$'\n' read -d '' -a cheminnamefile < <(find $chemin -type f -name '*.xxx')
printf "%s\n" "${cheminnamefile[@]}"
```

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 20, 2016, 11:17 UTC](https://www.debian-fr.org/t/bash-petit-souci-avec-un-tableau/28332/3 "2016-02-20T23:17:30Z")

</div>

plus d’informations sur les [tableaux](http://mywiki.wooledge.org/BashGuide/Arrays) :
