views:

398

answers:

3

Hey all.

I have trouble passing a variable from inside a loop.

Code:

# find all output.txt that has been modified last 24h ...
PROCESSED=1
find ${PROCESSED_DIR} -mtime -1 -name "output.txt" | while read i
do
    # .. and compare those with TMP_TXT
    if diff $i ${TMP_TXT} > /dev/null   
    then
        # If both are same EXIT search loop 
        PROCESSED=0
        exit
    fi
done
echo "PROCESSED=${PROCESSED}"

This will always output 1. Any idea how to make PROCESSED=0 ?

This is done on a Solaris 9 machine.

+5  A: 

The reason is that the while-command is run inside a pipe which means that it is running inside a sub-shell, so variable assignments are not propagated to the calling shell.

One solution is to redirect the input (you may need to write it to a temporary file first):

while read f; do
    ...
done < foo.tmp

Another solution is to use the stdout from the while-command to propagate the value of PROCESSED:

PROCESSED=`find | while read f; do
    echo "Echo other stuff on stderr" >&2 
    echo 1
done`
JesperE
Thanks mate! :D
A: 

The line

PROCESSED=0

will be executed by the while command as part of the pipe, and not by the shell. If you instead use xargs and put your while loop and comparison into a separate shell script which returns an appropriate return value you can use

find ${PROCESSED_DIR} -mtime -1 -name "output.txt" | xargs -n1 your_compare_script.sh && PROCESSED=0

in order to update the PROCESSED variable in the shell script.

hlovdal
A: 
William Pursell