Как вывести команду оболочки в переменную?

Как вывести команду оболочки в переменную?

Я пытаюсь написать простой скрипт:

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

Связанный контент