
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 for
loop, mas while
sim 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 du
a 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
Awk
també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 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