
Estoy intentando escribir un script simple:
stat=$(du /home/test/)
for i in "$stat"; do
folder=$("$i" | awk '{print $2}')
mail -s $folder [email protected]
done
Ejecuto el script en Shell y el resultado es el siguiente:
4 /home/test/.config/mc/mcedit
12 /home/test/.config/mc
16 /home/test/.config
Luego inserto echo en el script antes del bucle, y el resultado se ve así:
4 /home/test/.config/mc/mcedit 12 /home/test/.config/mc 16 /home/test/.config
Esto se debe a que no tiene comillas dobles. Con comillas dobles, la salida es la misma que en Shell. Entonces, el uso de comillas dobles para las variables en la carpeta $ de la variable de ciclo de bucle no funciona como se esperaba. En cambio, contiene todos los valores de la lista.
¿Cómo resolver esto?
Respuesta1
Aquí tienes una manera de conseguir lo que buscas, aunque no usando un for
bucle sino while
uno:
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
Por supuesto, como ya comentó Archemar, no hay razón para no canalizar directamente du
la salida al bucle:
du /home/test/ | while read i; do
folder=$(echo "$i" | awk '{print $2}')
echo "mail content" | mail -s $folder [email protected]
done
Awk
Tampoco es realmente necesario. El script se puede simplificar de esta manera:
du /home/test/ | while read size folder; do
echo "mail content" | mail -s "$folder" [email protected]
done
Como no parece utilizar los tamaños de los directorios, que es lo que du
está diseñado para calcular, puede utilizar find
en su lugar:
find /home/test -type d | while read folder; do
echo "mail content" | mail -s "$folder" [email protected]
done