Zoltan Boszormenyi írta:
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. Best regards, Zoltán Böszörményi
I just tried to narrow the test for the bug: ---b.sh------------------------- #!/bin/bash X=0 A=2 while [ $A -gt 0 ]; do X=1 A=$(($A - 1)) echo "A: $A X: $X" done echo "Final A: $A X: $X" -------------------------------- Result: -------------------------------- $ ./b.sh A: 1 X: 1 A: 0 X: 1 Final A: 0 X: 1 -------------------------------- The variables here keep their values. Hm. Then the bug may come from the "cat a.txt | while read i; do" construct, maybe another sub-shell is opened for this loop. But then putting "export" in front of the assignments inside the loop should solve this but it doesn't. It still seems to be a bug to me somewhere. Can someone help me? Thanks in advance and best regards, Zoltán Böszörményi