쉘 명령을 변수로 출력하는 방법은 무엇입니까?

쉘 명령을 변수로 출력하는 방법은 무엇입니까?

간단한 스크립트를 작성하려고 합니다.

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

관련 정보