Aug 10, 2011
tom

bash: variable loses value at end of while read loop

Question

I have a problem in one of my shell scripts. Asked a few colleagues, but they all just shake their heads (after some scratching), so I’ve come here for an answer.

According to my understanding the following shell script should print “Count is 5″ as the last line. Except it doesn’t. It prints “Count is 0″. If the “while read” is replaced with any other kind of loop, it works just fine. Here’s the script:

echo "1">input.data
echo "2">>input.data
echo "3">>input.data
echo "4">>input.data
echo "5">>input.dataCNT=0 cat input.data | while read ;
do
  let CNT++;
  echo "Counting to $CNT"
done 
echo "Count is $CNT"

Why does this happen and how can I prevent it? I’ve tried this in Debian Lenny and Squeeze, same result (i.e. bash 3.2.39 and bash 4.1.5.
I fully admit to not being a shell script wizard, so any pointers would be appreciated.

Answer

BASh FAQ entry #24: “I set variables in a loop. Why do they suddenly disappear after the loop terminates? Or, why can’t I pipe data to read?”

Related posts:

  1. Bash script error: ./test: line 5: UID: readonly variable
  2. Bash script to count number of files
  3. for loop multiple variables
  4. bash whiptail variable parameters
  5. Bash script normal user to Root

Leave a comment