![for 루프의 코드가 bash 셸의 첫 번째 디렉터리에서만 실행되는 이유는 무엇입니까?](https://linux55.com/image/26567/for%20%EB%A3%A8%ED%94%84%EC%9D%98%20%EC%BD%94%EB%93%9C%EA%B0%80%20bash%20%EC%85%B8%EC%9D%98%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%EC%84%9C%EB%A7%8C%20%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
라는 디렉토리 아래에는 특정 작업을 수행하려는 a
하위 폴더가 많이 있습니다 . 모두에게 동일합니다. 다음을 수행하지만 첫 번째 하위 디렉터리에서만 작동합니다.
for i in "a/*"
do
#echo $i
cd $i
mkdir test
mv *_no test
touch aaa
cd ..
done
위의 코드를 사용하고 싶습니다 a
.
답변1
첫 번째 cd
chdir은 첫 번째 디렉터리(두 수준의 하위 디렉터리)로 이동합니다. cd
한 레벨만 돌아왔기 때문에 그 다음에는 두 번째 레벨로 진행할 수 없습니다 . 즉, 시작한 곳으로 돌아오지 않습니다. 하지만 그럼에도 불구하고 여전히 "a/*"라는 하나의 값을 반복하고 있습니다.
이 내용을 인용하셨기 때문에 확장되지는 않습니다.
그러나 주위에 따옴표를 넣는 것을 잊었으므로 $i
그 시점에서는 인수로 확장됩니다 cd
.
코드에는 다른 많은 문제가 있습니다.
개선을 위한 몇 가지 제안:
for i in a/*/; do
(
cd -- "$i" &&
mkdir -p test || exit
mv -- *_no test
touch aaa
)
done
답변2
s를 사용할 때는 glob
따옴표를 제거해야 합니다. 그렇지 않으면 glob
s는 확장되지 않습니다.
그래서:
for i in a/*
답변3
루프 내에서 $i를 참조하면 a/*/
이미 단어로 확장되었기 때문에 아무 작업도 수행되지 않습니다. 예를 들어 a/*/
a/My Documents/로 확장하는 경우 첫 번째 루프 $i = a/My
와 두 번째 루프 에서 $i = Documents/
다음을 시도하십시오.
find . -maxdepth 1 -type d | while read i; do
(
cd -- "$i" &&
mkdir -p test || exit
mv -- *_no test
touch aaa
)
done