![다양한 루프에서 동일한 배열에 추가하고 마지막 값만 유지 Bash 4](https://linux55.com/image/3851/%EB%8B%A4%EC%96%91%ED%95%9C%20%EB%A3%A8%ED%94%84%EC%97%90%EC%84%9C%20%EB%8F%99%EC%9D%BC%ED%95%9C%20%EB%B0%B0%EC%97%B4%EC%97%90%20%EC%B6%94%EA%B0%80%ED%95%98%EA%B3%A0%20%EB%A7%88%EC%A7%80%EB%A7%89%20%EA%B0%92%EB%A7%8C%20%EC%9C%A0%EC%A7%80%20Bash%204.png)
나는 다음과 같은 것을 가지고 있습니다 :
FILES=()
for i in *.map
do
FILES+=($i)
done
find /var/candy -name "chocolate_[0-9]" | while read snack
do
FILES+=($snack)
done
for file in ../out/amsterdam/apples/{system.map,vmlinux}
do
FILES+=($file)
done
그러나 배열에는 ../out/amsterdam/apples/system.map
합계 만 포함됩니다 ../out/amsterdam/apples/vmlinux
. 다른 값은 어떻게 되나요? 변수에 무언가가 포함되어 있는지 확인하기 위해 에코하기 때문에 이러한 루프에 존재한다는 것을 알고 있습니다.
답변1
에서 가져옴배쉬 FAQ:
파이프라인 내의 루프에 변수를 설정했습니다. 루프가 끝나면 왜 사라지나요?
위에서 언급한 것처럼 잠재적으로 놀라운 동작이 발생하는 이유는 각 SubShell이 새로운 변수 컨텍스트와 환경을 도입하기 때문입니다. 위의 while 루프는 부모 셸에서 얻은 초기 값 "0"으로 생성된 linecount 변수의 자체 복사본을 갖는 새 하위 셸에서 실행됩니다. 이 사본은 계산에 사용됩니다. while 루프가 완료되면 하위 셸 복사본이 삭제되고 상위 셸의 원래 변수 linecount(해당 값은 변경되지 않음)가 echo 명령에 사용됩니다.
두 번째 루프에서 서브셸이 생성되는 것을 방지하려면 파이프가 아닌 다른 것을 통해 데이터를 공급할 수 있습니다.
while read snack; do
FILES+=($snack)
done < <(find /var/candy -name "chocolate_[0-9]")
.
while read snack; do
FILES+=($snack)
done <<<"$(find /var/candy -name "chocolate_[0-9]")"