Bash bug?

Jeff Vian jvian10 at charter.net
Mon Sep 26 07:11:06 UTC 2005


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
> 




More information about the fedora-list mailing list