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