Bah! Give me Ksh.
export a=0
cat $file | while read line
do
a=$(expr $a + 1)
done
Bash will fork the while loop as a separate process, inheriting (copying) its own environment, and the variable will only update locally, not in the parent process.This comment however reminds me of some behaviour of bash 2.03 or earlier, where this behaviour was flawed, if you suddenly changed execution path during a recursion in a shell script. Sorry I can't describe it better, and that bash version, that was before 2.03 is long gone now!
export a=0
while read line ; do
a=$(expr $a + 1)
done < $file
echo $a
(Some old shells fork on < but bash isn't one of them).Nice to know that bash doesn't fork loops that are being used with redirection, and not piping!