find & while [반복] 후에 변수는 변경되지 않습니다.

find & while [반복] 후에 변수는 변경되지 않습니다.

내 코드

var=34
find $1 -type f | while read line;
do
        file_status=`file  "$line"`
        file_name=`echo $line | sed s/".*\/"//g`
        line_length=${#file_name}
        if [ $line_length -gt $n ]; then
                echo "hi there"
                var=$((var+1))
        fi
done
echo $var

hi 메시지가 여러 번 표시되지만 while 루프를 완료한 후에는 내 변수가 34가 됩니다.

답변1

파이프( |)를 사용했고 파이프 주변의 명령이 서브셸에서 실행되기 때문입니다.

따라서 해당 서브쉘에서 변수의 값이 var변경(증가)되고 서브쉘이 종료되면 범위를 벗어나므로 부모 쉘의 값에는 아무런 영향을 미치지 않으므로 부모 쉘의 값은 34로 유지된다.


이 문제를 해결하려면 프로세스 대체를 사용하여 다음을 실행할 수 있습니다 find.

var=34
while read line; do
        file_status=`file  "$line"`
        file_name=`echo $line | sed s/".*\/"//g`
        line_length=${#file_name}
        if [ $line_length -gt $n ]; then
                echo "hi there"
                var=$((var+1))
        fi
done < <(find $1 -type f)
echo $var

관련 정보