Re: Bash bug?

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

 



In order to read a file without opening a sub shell do:

while read LINE; do 

	echo $LINE
	blah blah

done  < file.txt

Gilboa

On Mon, 2005-09-26 at 03:30 -0500, Jeff Vian 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
> > > 
> > 
> 
> 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