Re: Bash bug?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2005-09-26 at 02:11 -0500, Jeff Vian wrote:
> On Mon, 2005-09-26 at 07:12 +0200, Zoltan Boszormenyi wrote:
> > Hi,
> > 
> > I am trying something like the following,
> > with a configuration file containing a token and
> > a directory in a line, depending on the tokens,
> > certain actions should be taken later. Validating
> > the configuration file whether all the required/optional
> > tokens are in the file should go like this:
> > 
> > -----a.txt----------------------
> > A directory1
> > B directory2
> > C directory3
> > --------------------------------
> > 
> > -----a.sh-----------------------
> > #!/bin/bash
> > 
> > HAS_A=0
> > HAS_B=0
> > HAS_C=0
> > cat a.txt | while read i ; do
> >          if [ "`echo $i | awk '{ print $1 }'`" = "A" ]; then
> >                  HAS_A=1
> >          fi
> >          if [ "`echo $i | awk '{ print $1 }'`" = "B" ]; then
> >                  HAS_B=1
> >          fi
> >          if [ "`echo $i | awk '{ print $1 }'`" = "C" ]; then
> >                  HAS_C=1
> >          fi
> >          echo "A: $HAS_A B: $HAS_B C: $HAS_C"
> > done
> > echo "Final A: $HAS_A B: $HAS_B C: $HAS_C"
> > --------------------------------
> > 
> > Result is:
> > 
> > --------------------------------
> > $ ./a.sh
> > A: 1 B: 0 C: 0
> > A: 1 B: 1 C: 0
> > A: 1 B: 1 C: 1
> > Final A: 0 B: 0 C: 0
> > --------------------------------
> > 
> > It seems to be a bug to me, the envvars lose their values
> > they gained in the loop. It's an ancient bug I must add,
> > I just rechecked it and bash in RedHat 7.1 behaves the same.
> > How can I preserve the variables' values? Putting "export"
> > in front of every assignments doesn't help.
> > 
> Careful,  those are not environment variables as you imply by the
> statement above when you call them envars.
> 
> This is caused by the scope of variables.
> You are actually creating 2 different copies of each HAS_A, HAS_B, and
> HAS_C.
> The first exists outside the while loop, the second exists only inside
> the while loop. And all only exist while the script is executing. Even
> though the name is the same, the scope is different.
> 
> Even if they were environment variables and had a permanent life outside
> the script, the value assigned still only lasts as long as the calling
> process lives (in this case the while loop).  I tested this to verify.
>  
> > Best regards,
> > Zoltán Böszörményi
> > 
> 

The change in the script [1] makes this work as you expected [2].

---[1]------------------------------------------------------

#!/bin/bash

exec < a.txt

HAS_A=0
HAS_B=0
HAS_C=0
while read  i ; do
         if [ "`echo $i | awk '{ print $1 }'`" = "A" ]; then
                 HAS_A=1
         fi
         if [ "`echo $i | awk '{ print $1 }'`" = "B" ]; then
                 HAS_B=1
         fi
         if [ "`echo $i | awk '{ print $1 }'`" = "C" ]; then
                 HAS_C=1
         fi
         echo "A: $HAS_A B: $HAS_B C: $HAS_C"
done
echo "Final A: $HAS_A B: $HAS_B C: $HAS_C"

----[2]----------------------------------------
[jeff@eagle test]$ ./a.sh
A: 1 B: 0 C: 0
A: 1 B: 1 C: 0
A: 1 B: 1 C: 1
Final A: 1 B: 1 C: 1


[Index of Archives]     [Current Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]     [Fedora Docs]

  Powered by Linux