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.data CNT=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.
while read; do let CNT++; done <input.data
, which avoids the pipe, and thus variables losing their values when that subshell ends. (If you need to read from the output of another process, see "Process Substitution" in the manual.) Note that usingecho "Count is" $(wc -l <input.data)
is probably faster for large input files, and is more concise if all you wanted was a count of the lines.