
Ich versuche, ein einfaches Skript zu schreiben:
stat=$(du /home/test/)
for i in "$stat"; do
folder=$("$i" | awk '{print $2}')
mail -s $folder [email protected]
done
Ich führe das Skript in der Shell aus und die Ausgabe sieht folgendermaßen aus:
4 /home/test/.config/mc/mcedit
12 /home/test/.config/mc
16 /home/test/.config
Ich füge dann im Skript vor der Schleife ein Echo ein und die Ausgabe sieht dann so aus:
4 /home/test/.config/mc/mcedit 12 /home/test/.config/mc 16 /home/test/.config
Dies liegt daran, dass es keine Anführungszeichen gibt. Mit Anführungszeichen ist die Ausgabe dieselbe wie in der Shell. Daher funktioniert die Verwendung von Anführungszeichen für Variablen in der Schleifenzyklusvariable $folder nicht wie erwartet. Stattdessen enthält sie alle Werte aus der Liste.
Wie kann dieses Problem behoben werden?
Antwort1
So können Sie Ihr Ziel erreichen, indem Sie allerdings keine for
Schleife, sondern eine while
einzelne verwenden:
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
Natürlich gibt es, wie Archemar bereits kommentierte, keinen Grund, die du
Ausgabe nicht direkt an die Schleife weiterzuleiten:
du /home/test/ | while read i; do
folder=$(echo "$i" | awk '{print $2}')
echo "mail content" | mail -s $folder [email protected]
done
Awk
ist auch nicht wirklich notwendig. Das Skript kann folgendermaßen vereinfacht werden:
du /home/test/ | while read size folder; do
echo "mail content" | mail -s "$folder" [email protected]
done
du
Da Sie die Verzeichnisgrößen, die eigentlich berechnet werden sollen, nicht zu nutzen scheinen , können Sie find
stattdessen Folgendes verwenden:
find /home/test -type d | while read folder; do
echo "mail content" | mail -s "$folder" [email protected]
done