Como gerar um comando shell em uma variável?

Como gerar um comando shell em uma variável?

Estou tentando escrever um script simples:

stat=$(du /home/test/)
for i in "$stat"; do
folder=$("$i" | awk '{print $2}')
mail -s $folder [email protected]
done

Eu executo o script no shell e a saída fica assim:

4       /home/test/.config/mc/mcedit
12      /home/test/.config/mc
16      /home/test/.config

Em seguida, insiro echo no script antes do loop e a saída fica assim:

4 /home/test/.config/mc/mcedit 12 /home/test/.config/mc 16 /home/test/.config

Isso ocorre porque sem aspas duplas. Com aspas duplas, a saída é igual à do shell. Portanto, usar aspas duplas para variáveis ​​​​na variável $folder do ciclo de loop não funciona conforme o esperado. Em vez disso, contém todos os valores da lista.

Como resolver isso?

Responder1

Aqui está uma maneira de conseguir o que você procura, embora não usando um forloop, mas whilesim um:

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

Claro, como Archemar já comentou, não há razão para não canalizar diretamente dua saída para o loop:

du /home/test/ | while read i; do
    folder=$(echo "$i" | awk '{print $2}')
    echo "mail content" | mail -s $folder [email protected]
done

Awktambém não é realmente necessário. O script pode ser simplificado desta forma:

du /home/test/ | while read size folder; do
    echo "mail content" | mail -s "$folder" [email protected]
done

Como você parece não usar os tamanhos dos diretórios, que é o que dufoi projetado para calcular, você pode usar find:

find /home/test -type d | while read folder; do
    echo "mail content" | mail -s "$folder" [email protected]
done

informação relacionada