# BASH probleme de variable globale / locale

**URL:** <https://www.debian-fr.org/t/bash-probleme-de-variable-globale-locale/83204>\
**Category:** Programmation\
**Created:** [Novembre 7, 2020, 12:48 UTC](https://www.debian-fr.org/t/bash-probleme-de-variable-globale-locale/83204 "2020-11-07T12:48:27Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Novembre 7, 2020, 12:48 UTC](https://www.debian-fr.org/t/bash-probleme-de-variable-globale-locale/83204/1 "2020-11-07T12:48:27Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![anon70622873](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@anon70622873](https://www.debian-fr.org/u/anon70622873)\
**Post date:** [Novembre 7, 2020, 1:38 UTC](https://www.debian-fr.org/t/bash-probleme-de-variable-globale-locale/83204/2 "2020-11-07T13:38:36Z")

</div>

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](https://www.gnu.org/software/bash/manual/bash.html#Pipelines). (et UUOC 😉 )

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Novembre 7, 2020, 2:07 UTC](https://www.debian-fr.org/t/bash-probleme-de-variable-globale-locale/83204/3 "2020-11-07T14:07:58Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![anon70622873](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@anon70622873](https://www.debian-fr.org/u/anon70622873)\
**Post date:** [Novembre 7, 2020, 2:13 UTC](https://www.debian-fr.org/t/bash-probleme-de-variable-globale-locale/83204/4 "2020-11-07T14:13:08Z")

</div>

> [@Zargos](#):
>
> la fonction est pas vide j’ai juste simplifié pour focaliser sur la variable

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…

> [@Zargos](#):
>
> Il faut donc que je trouve une autre méthode pour parcourir le fichier

La méthode à privilégier est :

```auto
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

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Novembre 7, 2020, 2:20 UTC](https://www.debian-fr.org/t/bash-probleme-de-variable-globale-locale/83204/5 "2020-11-07T14:20:15Z")

</div>

> [@anon70622873](#):
>
> 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 ‹&nbsp;^#&nbsp;› | 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

```

---

<div class="post-metadata">

**Author:** ![anon70622873](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@anon70622873](https://www.debian-fr.org/u/anon70622873)\
**Post date:** [Novembre 7, 2020, 2:33 UTC](https://www.debian-fr.org/t/bash-probleme-de-variable-globale-locale/83204/6 "2020-11-07T14:33:55Z")

</div>

C’est tordu…

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

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Novembre 7, 2020, 2:48 UTC](https://www.debian-fr.org/t/bash-probleme-de-variable-globale-locale/83204/7 "2020-11-07T14:48:35Z")

</div>

c’est mieux en effet
