Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't my variable seem to increment in my bash while loop?

I am fairly new to bash scripting. I can't seem to get the correct value of my counting variables to display at the end of of a while loop in my bash script.

Background: I have a fairly simple task: I would like to pass a text file containing a list of file paths to a bash script, have it check for the existence of those files, and count the number of existing/missing files. I got most of the script to work, except for the counting part.

N=0
correct=0
incorrect=0
cat $1 | while read filename ; do
    N=$((N+1))
    echo "$N"

    if ! [ -f $filename ]; then

        incorrect=$((incorrect+1))
    else
        correct=$((correct+1))

    fi

done

echo "# of Correct Paths: $correct"
echo "# of Incorrect Paths: $incorrect"
echo "Total # of Files: $N"

If I have a list of 5 files, 4 of which exist, I expect to get the following output (note the echo command within the while loop):

1
2
3
4
5
# of Correct Paths: 4
# of Incorrect Paths: 1
Total # of Files: 5

Instead, I get:

1
2
3
4
5
# of Correct Paths: 0
# of Incorrect Paths: 0 
Total # of Files: 0

What happened to the values of these variables? Google had many suggestions of questionable quality and I think I could get it to work with a little more searching, but a brief explanation of what I'm doing wrong would be very helpful.

like image 301
wwwilliam Avatar asked Feb 21 '11 00:02

wwwilliam


People also ask

How do I increment a variable in bash?

Increment Bash Variable with += Operator Another common operator which can be used to increment a bash variable is the += operator. This operator is a short form for the sum operator. The first operand and the result variable name are the same and assigned with a single statement.

Can you do += in bash?

Bash also provides the assignment operators += and -= to increment and decrement the value of the left operand with the value specified after the operator.

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.


1 Answers

This is because you are using the useless cat command with a pipe, causing a subshell to be created. Try it without the cat:

while read filename ; do
    N=$((N+1))
    ....
done < file
like image 63
kurumi Avatar answered Oct 05 '22 18:10

kurumi