while 루프에서 전역 변수 수정

while 루프에서 전역 변수 수정

폴더를 처리하고 동시에 파일 수를 계산하는 스크립트가 있습니다.

i=1
find tmp -type f | while read x
do 
   i=$(($i + 1))
   echo $i
done
echo $i

그런데 $i항상 그렇네요 1. 어떻게 해결하나요?

답변1

귀하의 예에서 while 루프는 서브셸에서 실행되므로 while 루프 내부의 변수 변경은 외부 변수에 영향을 미치지 않습니다. 이는 파이프가 있는 루프를 사용하고 있기 때문에 자동으로 서브셸에서 실행됩니다.

다음은 while 루프를 사용하는 대체 솔루션입니다.

i=1
while read x; do
   i=$(($i + 1))
   echo $i
done <<<$(find tmp -type f)
echo $i

for 루프를 사용하는 동일한 접근 방식은 다음과 같습니다.

i=1
for x in $(find tmp -type f);
do 
   i=$(($i + 1))
   echo $i
done
echo $i

자세한 내용은 다음 게시물을 참조하세요.

고급 Bash 스크립팅 가이드의 다음 장도 참조하세요.

답변2

i=1
while read x
do
   i=$(($i + 1))
   echo $i
done < <(find tmp -type f)
echo $i

https://stackoverflow.com/questions/7390497/bash-propagate-value-of-variable-to-outside-of-the-loop

관련 정보