Bash 5 : Portée des variables

Bash 5 : Portée des variables - Shell/Batch - Programmation

Marsh Posté le 13-12-2022 à 14:55:00    

Bonjour,

 

Jusqu'à peu, je pensais avoir compris la portée des variables dans un script Bash, mais, ça ne semble finalement pas être le cas.

 

Les variables globales, ça va, sauf si y'a un truc bizarre, elles sont globales donc accessibles dans tout le script.

 

Par contre, pour les variables locales, je m'étais mis en tête qu'elles n'étaient valables que pour la fonction F1 où elles sont déclarées et que si je voulais les utiliser dans une autre fonction F2, appelée depuis la fonction F1, je devais les passer à la fonction F2 et les récupérer dans des variables locales propres à la fonction F2.

 

Sauf que ça ne semble pas être le cas et comme j'ai déjà eu des mauvaises surprises par le passé avec les variables, j'aimerais être certain d'avoir bien compris avant de partir bille en tête et de me bouffer un nouveau mur… :o

 

Donc, pour résumer :

  • Variables globales : accessibles partout
  • Variables locales : accessibles dans la fonction F où elles ont été déclarées et dans les fonctions appelées dans la fonction F mais pas ailleurs.


Un petit script bidon pour illustrer ce que je pense avoir compris : l'appel de la fonction test2 dans la fonction test1 va permettre d'afficher ce que dit bidule, alors que l'appel de cette même fonction test2 en dehors de la fonction test1 va échouer, puisque la variable bidule n'est définie que dans test1.

 

#!/usr/bin/env bash

 

test_1() {
  local bidule="truc"

 

 test2
}

 

test2() {
  echo "bidule dit ${bidule}"
}

 

test1
test2

Ce qui donne ce que j'attendais :

bidule dit truc
bidule dit


Est-ce que j'ai maintenant bien compris ou est-ce qu'il y a une subtilité qui attend son heure pour me rendre chèvre avec des situations plus compliquées que ce script bidon ?


Message édité par gabegie le 13-12-2022 à 14:55:49
Reply

Marsh Posté le 13-12-2022 à 14:55:00   

Reply

Marsh Posté le 13-12-2022 à 15:50:53    

Il peut y avoir "shadowing" (désolé :o) : avec

test2() {
  local bidule="machin"
  echo "bidule dit ${bidule}"
}


tu obtiens

bidule dit machin
bidule dit machin

Reply

Marsh Posté le 13-12-2022 à 21:00:39    

Merci pour la précision :jap:
 
Pour ce problème, ça va, je faisais attention à avoir des noms différents dans chaque fonction : en fait, j'ai découvert que je me trompais sur la façon de fonctionner des variables parce qu'à force de me creuser la tête pour trouver des noms différents pour la même variable que je passais d'une fonction à l'autre, j'ai oublié, dans une fonction "fille", d'utiliser le nom que je lui avais donné dans cette même fonction "fille" :o
 
J'ai laissé sans faire gaffe le nom donné dans la fonction "mère" et aujourd'hui, en relisant le code, je me dis "bizarre que ça marche alors que j'utilise pas le bon nom de variable". [:canaille]  
 
Ça m'arrange au final : il n'y a pas tant de façons différentes que ça de nommer une variable qui contient un tableau avec les métadonnées d'un livre ou une liste d'images :pfff:
 
Il ne me reste plus qu'à relire tous mes scripts récents, pour simplifier un poil les choses :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed