간단한 스크립트를 작성하려고 합니다.
stat=$(du /home/test/)
for i in "$stat"; do
folder=$("$i" | awk '{print $2}')
mail -s $folder [email protected]
done
쉘에서 스크립트를 실행했는데 출력은 다음과 같습니다.
4 /home/test/.config/mc/mcedit
12 /home/test/.config/mc
16 /home/test/.config
그런 다음 루프 앞에 스크립트에 echo를 삽입하면 출력은 다음과 같습니다.
4 /home/test/.config/mc/mcedit 12 /home/test/.config/mc 16 /home/test/.config
이는 큰따옴표가 없기 때문입니다. 큰따옴표가 포함된 출력은 셸의 출력과 동일합니다. 따라서 루프 변수 $folder 내의 변수 주위에 큰따옴표를 사용하면 예상대로 작동하지 않습니다. 대신 목록의 모든 값이 포함됩니다.
이 문제를 어떻게 해결하나요?
답변1
루프를 for
사용하는 대신 원하는 것을 달성하는 방법은 다음과 같습니다 .while
stat=$(du /home/test/)
echo "$stat" | while read i; do
folder=$(echo "$i" | awk '{print $2}')
echo "mail content" | mail -s $folder [email protected]
done
du
물론 Archemar가 이미 언급했듯이 출력을 루프에 직접 파이프 하지 않을 이유가 없습니다 .
du /home/test/ | while read i; do
folder=$(echo "$i" | awk '{print $2}')
echo "mail content" | mail -s $folder [email protected]
done
Awk
실제로는 필요하지 않습니다. 스크립트는 다음과 같이 단순화될 수 있습니다.
du /home/test/ | while read size folder; do
echo "mail content" | mail -s "$folder" [email protected]
done
du
디렉토리 크기( 계산하도록 설계된 크기)를 사용하지 않는 것 같으므로 다음을 find
사용할 수 있습니다.
find /home/test -type d | while read folder; do
echo "mail content" | mail -s "$folder" [email protected]
done