¿Cómo generar un comando de shell en una variable?

¿Cómo generar un comando de shell en una variable?

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 forbucle sino whileuno:

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 dula 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

AwkTampoco 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 duestá diseñado para calcular, puede utilizar finden su lugar:

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

información relacionada