BASH probleme de variable globale / locale

Bonjour j’ai un probleme en bash avec un script structure de la facon suivante:

#!/bin/bash

model='/file/path/to/mdel/file'

fonction1 () {
}

declare -A policy
policy['c0c'="toto"
echo "UN="${!policy[@]}

function2 () {

cat $model | while read line
do
...traitement divers...

policy['local']=1

echo "DEUX="${!policy[@]}
done

echo "TROIS="${!policy[@]}

}

function1  # lancement fonction1
fonction2  # lancement fonction2

# fin du script

echo UN affiche bien le contenu
echo DEUx affiche aussi le bon contenu
echo TROIS affiche le contenu comme UN au lieu de DEUX

Ton script contient plein d’erreurs : function/fonction, une fonction vide, etc.

Sinon le problème de valeur de variable qui ne semble pas conservée est du à l’utilisation du pipe. (et UUOC :wink: )

la fonction est pas vide j’ai juste simplifié pour focaliser sur la variable :slight_smile: mais le pipe était aussi ce que je pensais. Il faut donc que je trouve une autre méthode pour parcourir le fichier

Certes mais c’est loin d’être la seule erreur. Il aurait été préférable de donner un bout de script testé et fonctionnel…

La méthode à privilégier est :

while read line
do
  echo "$line"
done < file to read

Et pour comprendre pourquoi cela ne fonctionne pas avec un pipe, extrait de la doc citée plus haut :

Each command in a pipeline is executed in its own subshell, which is a separate process

Oui j’avais oublié ce détail.

La première fonction est fonctionnelle, et ne consiste en fait qu’en une série de cat << EOF > > fichier
texte…
EOF

dans le while, c’était en fait cat fichier | grep ‹ ^# › | while read line.
C’est pour ça que je ne peux pas le mettre après le done car il ne veut pas du grep (normal).
je vais rectifier ma boucle en:

   while read line
    do
    if [[ -z `grep '^#' fichier ]]; then
       echo "$line"
    fi
    done < fichier

C’est tordu…

while read line
do
  [[ $line =~ ^#.* ]] && continue
  echo "$line"
done <  file_to_read

c’est mieux en effet