Como enviar um comando shell para uma variável?

0

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 corro o script no shell e a saída se parece com:

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

Eu então insiro o echo no script antes do loop, e a saída se parece com:

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

Isso ocorre porque sem aspas duplas. Com saída de aspas duplas é o mesmo que no shell. Então, usar aspas duplas para variáveis na variável $ ciclo loop não funciona como esperado. Em vez disso, contém todos os valores da lista.

Como resolver isso?

    
por DeadKenny 22.04.2017 / 15:27

1 resposta

3

Aqui está uma maneira de obter o que você procura, embora não use um loop for , mas while one:

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

Naturalmente, como Archemar já comentou, não há razão para não canalizar diretamente du output 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

Awk também não é necessário. O script pode ser simplificado dessa maneira:

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 du foi 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
    
por 22.04.2017 / 15:44