Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does my Bash counter reset after while loop

Tags:

bash

I have a Bash script where I want to count how many things were done when looping through a file. The count seems to work within the loop but after it the variable seems reset.

nKeys=0
cat afile | while read -r line
do
  #...do stuff
  let nKeys=nKeys+1
  # this will print 1,2,..., etc as expected
  echo Done entry $nKeys
done
# PROBLEM: this always prints "... 0 keys"
echo Finished writing $destFile, $nKeys keys

The output of the above is something alone the lines of:

Done entry 1
Done entry 2
Finished writing /blah, 0 keys

The output I want is:

Done entry 1
Done entry 2
Finished writing /blah, 2 keys

I am not quite sure why nKeys is 0 after the loop :( I assume it's something basic but damned if I can spot it despite looking at http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html and other resources.

Fingers crossed someone else can look at it and go "well duh! You have to ..."!

like image 598
S42 Avatar asked Feb 15 '11 16:02

S42


People also ask

How does while loop work in bash?

The while loop is used to performs a given set of commands an unknown number of times as long as the given condition evaluates to true. The while statement starts with the while keyword, followed by the conditional expression. The condition is evaluated before executing the commands.

How do you break out of a while loop in bash?

Breaking from a while LoopUse the break statement to exit a while loop when a particular condition realizes. The following script uses a break inside a while loop: #!/bin/bash i=0 while [[ $i -lt 11 ]] do if [[ "$i" == '2' ]] then echo "Number $i!" break fi echo $i ((i++)) done echo "Done!"

What is a bash for loop?

A bash for loop is a bash programming language statement which allows code to be repeatedly executed. A for loop is classified as an iteration statement i.e. it is the repetition of a process within a bash script. For example, you can run UNIX command or task 5 times or read and process list of files using a for loop.


1 Answers

In the just-released Bash 4.2, you can do this to prevent creating a subshell:

shopt -s lastpipe

Also, as you'll probably see at the link Ignacio provided, you have a Useless Use of cat.

while read -r line
do
    ...
done < afile
like image 129
Dennis Williamson Avatar answered Nov 14 '22 06:11

Dennis Williamson