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 :
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 :
- Ne pas préciser de nom de variable à read. Cela évite la perte d’information
Je te laisse faire ce test pour comprendre…
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.
- 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 :
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 :
read
chemin="${REPLY}"
cd "${chemin}"
IFS=$'\n' read -d '' -a cheminnamefile < <(find $chemin -type f -name '*.xxx')
printf "%s\n" "${cheminnamefile[@]}"