Bash bug?

BRUCE STANLEY bruce.stanley at prodigy.net
Mon Sep 26 13:15:21 UTC 2005



--- Jeff Vian <jvian10 at charter.net> wrote:

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

This is also a problem with  ksh under linux.

I ran into this very 'sub-shell' problem when
converting ksh scripts to run under linux that
were developed to run under SCO Unix.

Other versions of System V Unix I have worked
with do not have this 'sub-shell' problem
either.

This seems to be a Linux issue with the shells.





More information about the fedora-list mailing list