Wie gibt man einen Shell-Befehl in eine Variable aus?

Wie gibt man einen Shell-Befehl in eine Variable aus?

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 forSchleife, sondern eine whileeinzelne 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 duAusgabe 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

Awkist 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

duDa Sie die Verzeichnisgrößen, die eigentlich berechnet werden sollen, nicht zu nutzen scheinen , können Sie findstattdessen Folgendes verwenden:

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

verwandte Informationen