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