
Я пытаюсь написать простой скрипт:
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
вывод напрямую в цикл:
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