Bash : while문에 파이프로 던질경우 서브 프로세스를 생성하므로 while 문 안에 있는 변수를 활용할수 없다.

while문에 파이프로 던질경우 서브 프로세스를 생성하므로 while 문 안에 있는 변수를 활용할수 없다. 그러나 {} 블럭을 사용하면 while문 밖에서도 사용이 가능하다. <– 이렇게 할바에 리다이렉트로 사용하는편이 낫다.

declare -a FILES
i=0
find ${IMG_DIR}/${TARGET_DIR}/ -maxdepth 1 -type f -print0 -regex ".*\.\(jpg\|JPG\)" | {
    while IFS= read -r -d '' FILE;
    do  
        echo "$((i++)) : $FILE <br />"
        FILES+=("$FILE")
    done
	echo ${#FILES[@]}
}

위의 방법대로 하면 while  문은 서브프로세스를 생성한다. $FILES 변수는 파이프 블럭 내부에서만 이용되는데 { } 블럭을 넣어주면 외부에도 접근이 된다. 그러나 이렇게 되는 처리방법보다 아래의 방법이 좀더 수월하다.

@대안

declare -a FILES
i=0
while IFS= read -r -d '' FILE;
do  
    echo "$((i++)) : $FILE <br />"
    FILES+=("$FILE")
done < <(find ${IMG_DIR}/${TARGET_DIR}/ -maxdepth 1 -type f -print0 -regex ".*\.\(jpg\|JPG\)")
echo ${#FILES[@]}

많은 스크립트가 왜이렇게 사용되어지는 위의 두가지 스크립트를 비교해보면 알수 있다.

관련 글

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다