[BASH] Portée d'une variable

Portée d'une variable [BASH] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 10-06-2004 à 22:44:14    

Bonjour
 
J'ai un problème avec la gestion des variables en bash.
Je ne comprend pas pourquoi dans l'exemple ci-dessous, il n'y
a qu'une ligne vide qui s'affiche
 

Code :
  1. #!/bin/bash
  2. function toto ()
  3. {
  4. R="3"
  5. }
  6. function titi()
  7. {
  8. echo "i" | toto
  9. echo $R
  10. }
  11. titi


 
Si quelqu'un pouvait m'éclairer?

Reply

Marsh Posté le 10-06-2004 à 22:44:14   

Reply

Marsh Posté le 10-06-2004 à 23:48:30    

edit: j'avais dit des conneries fausses en shell script, sorry :D


Message édité par philou_a7 le 11-06-2004 à 00:12:29
Reply

Marsh Posté le 10-06-2004 à 23:56:47    

c pas vraiment ca, dommage (j'y avais pensé)
mais en bash, les affectations de variables sont globales.
Pour t'en convaincre essaye ca.

Code :
  1. #!/bin/bash
  2. function toto ()
  3. {
  4. R="3"
  5. }
  6. function titi()
  7. {
  8. toto
  9. echo $R
  10. }
  11. titi


 
Mais ce que je comprend pas c pourquoi dans ce cas ca marche, alors que avec un pipe ca ne marche pas  :??:
 
Merci quand même
 
Une autre idée?

Reply

Marsh Posté le 11-06-2004 à 00:14:23    

bon, effectivement, j'm'a gourré.... la fatigue tout çaaaa :p
 
sinon, je vois pas mais l'appel echo "i" | vers une fonction, c'est bizarre...
tu peu pas faire in=`echo "i"` && toto($in) avec un parametre a ta fonction plutot ?

Reply

Marsh Posté le 11-06-2004 à 00:17:05    

Ca arrive ;)
le echo c'était juste pour donner quelque chose au pipe ;)
la fonction toto a besoin de lire dans l'entrée standard
 
en vrai ce n'est pas un echo "i", mais une succession de pipe ;)

Reply

Marsh Posté le 11-06-2004 à 00:22:35    

bah oui mais envoyer un pipe dans une fonction, j'avoue que ca me chiffonne un peu...
 
c'est pour ca que je te propose de recuperer la sortie de ta serie de | avec les guillemets ` ` et de passer cette valeur à ta fonction a la place de lire stdin

Reply

Marsh Posté le 11-06-2004 à 00:30:16    

ca marche très bien les pipe dans les fonctions :)
l'autre méthode je connais, mais en fait j'ai besoin de récupérer des lignes, et l'autre méthode ne conserve pas les lignes :/
 

Code :
  1. $ cat > tmp.txt
  2. une ligne
  3. seconde ligne
  4. troisième ligne
  5. $ a=`more tmp.txt` ; echo $a
  6. une ligne seconde ligne troisième ligne


On voit bien ici que l'on a tout sur une ligne, ce qui ne me conviens pas :( c'est pour ca que j'utilise un pipe

Reply

Marsh Posté le 11-06-2004 à 08:25:27    

nan... marche pas non plus

Reply

Marsh Posté le 11-06-2004 à 08:34:16    

philou_a7 a écrit :

nan... marche pas non plus


J'ai pas compris de quoi tu parles, C'est un copier coller de ma console, donc sa affiche bien ce qui est écrit, mais c'est pas ce que je veux.
 
La vrai fonction toto contient une boucle while read ligne; do; qqchose; done.
C'est pour ca que j'ai besoin du pipe

Reply

Marsh Posté le 11-06-2004 à 08:46:42    

Euh non, y a eu un autre message entre le tien et le mien mais il a ete effacé :/
 
du coup le mien veux plus rien dire :lol:

Reply

Marsh Posté le 11-06-2004 à 08:46:42   

Reply

Marsh Posté le 11-06-2004 à 08:48:02    

Oui en effet...
 :lol:  :lol:

Reply

Marsh Posté le 11-06-2004 à 09:00:52    

j'avais peut etre pas totalement dit une connerie au debut...


#!/bin/bash
 
RRR="xxx"
 
function toto ()
{
        RRR="3"
        TT="t"
        echo "RRR dans toto "$RRR
}
 
function tata()
{
        echo "TT dans tata "$TT
        echo "RRR dans tata "$RRR
}
 
function titi()
{
        echo "TT dans titi"$TT
        echo "appel toto" | toto
        echo "RRR dans titi " $RRR
}
 
titi
tata
toto
echo "t" | toto
 
echo "RRR a la fin "$RRR
echo "TT a la fin "$TT


 
essaie ca et regarde bien les resultats
 
je me demande si "local" n'est pas implicite dans une fonction ;)

Reply

Marsh Posté le 11-06-2004 à 09:09:03    

Je viens d'avoir l'explication sur le forum gentoo

Citation :

chaque portion d'un pipe est executée dans un sous-shell, et donc les affectations de variable qui s'y trouvent n'ont aucun effet sur le programme principal.


 
http://forums.gentoo.org/viewtopic [...] 23#1230723
 
Ce que je veux faire n'est apparement pas possible, je vais essayer de repenser mon script autrement. Merci pour ton aide

Reply

Marsh Posté le 11-06-2004 à 09:23:39    

ah bah d'accord :D
et si tu utilises export pour la declaration, ca traverse pas les sous-shells ?

Reply

Marsh Posté le 11-06-2004 à 10:01:31    

j'ai déjà essayé, et apparement non

Reply

Marsh Posté le 11-06-2004 à 10:21:50    

quand je dis que perl, c'est bien :D

Reply

Marsh Posté le 11-06-2004 à 10:24:11    

faudra que j'apprenne un jour... mais un jour qui n'est pas aujourd'hui ;)

Reply

Sujets relatifs:

Leave a Replay

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