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[@]}
많은 스크립트가 왜이렇게 사용되어지는 위의 두가지 스크립트를 비교해보면 알수 있다.