@VolkerRaschek: Du machst da komische Sachen mit Anführungszeichen. Zum Beispiel die Variable nicht in doppelten Anführungszeichen, den folgenden literalen Schrägstrich dann aber schon.
Und wie kommt man auf "s/"$(echo ${SED_PARAMETER})"//"
? Das ist eine ziemlich komplizierte Art "s/$SED_PARAMETER//"
zu schreiben.
printf
sollte man nicht ohne Formatzeichenkette und Argumente verwenden. Es muss sicher sein, dass im ersten Argument nichts steht was für printf
eine besondere Bedeutung hat, also das da auch nichts durch in das erste Argument hinein formatierte Werte hinein kommen kann. Und das ist am aller einfachsten wenn das erste Argument immer eine statische, literale Zeichenkette ist, ohne irgendwelche Variablen. Wenn man gar nichts in eine Zeile hineinformatieren möchte, wie bei der Kopfzeile, macht printf wenig Sinn, es gibt ja auch print
.
In der for
-Schleife haben wir einen unnötigen Einsatz von cat
→ cut
nimmt Dateinamen als Argument(e) entgegen. Die Schleife wird so auch nur funktionieren wenn in den einzelnen Zeilen keine Leerzeichen vorkommen. Schleifen über Zeilen würde man mit einer while read…
-Schleife machen.
Bei der ersten Zeile in der Schleife hast Du dann das Problem warum es hängt → worauf wird Deiner Meinung nach das awk
-Programm denn angewendet? Die richtige Antwort auf die Frage lautet: Auf die Zeilen von der Standardeingabe des Skripts. Das wartet an der Stelle also darauf das jemand Daten eingibt, oder das die beim Aufruf von aussen rein ge”pipe”t werden. Da fehlt also ein Dateiname wo die Daten herkommen.
Dann funktioniert das mit "${i}"
nicht. Das ist das awk
-Programm. Das hat keine Ahnung über Variablen die im Bash-Programm sind. Das sieht so aus als hättest Du den Wert von $i
aus dem Bash-Programm in den Quelltext für das awk
-Programm hinein formatieren wollen. Lass das besser sein. Man kann awk
auf der Kommandozeile Variablen übergeben. Das ist einfacher und sicherer als Werte in den Quelltext zu formatieren.
Ich lande dann ungefähr hier:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | SED_PARAMETER=$(echo "$PARENT_PATH/" | sed 's/\//\\\//g')
BODY=$(
du -shx "$PARENT_PATH/"* \
| sort --human-numeric-sort \
| sed "s/$SED_PARAMETER//" \
| awk 'BEGIN{print "Nr.\tSpace\tFolder"} {printf "%s)\t%s\n", NR, $0}'
)
for user in $(cut -d ' ' -f 1 './users'); do
GPG_KEY=$(awk --assign user=user '$1 == user { print $2 }' './user_to_key')
echo "$BODY" \
| gpg -ea -r "$GPG_KEY" \
| mail -s "Notify-Used-Disk-Space - $HOSTNAME" "$user"
done
|
Falls die Datei aus der Du den GPG-Schlüssel holst ebenfalls die users
-Datei sein sollte, dann ist das total unsinnig nicht gleich eine while read…
-Schleife über diese Datei zu machen sondern für jede Zeile erneut awk
auf die Datei los zu lassen um die Zeile zu finden aus der der gerade verarbeitete Benutzer stammt.
sed
müsste man hier übrigens komplett ersetzen können. Den ersten Aufruf durch Bash-interne Variablenexpansion mit ersetzen, und der zweite Aufruf vor dem awk
könnte durch das awk
-Programm erledigt werden.
Edit: Mal sed
ersetzt und angenommen das ./users
tatsächlich Benutzername und GPG-Schlüssel pro Zeile enthält:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | BODY=$(
du -shx "$PARENT_PATH/"* \
| sort -h \
| awk -v parent_path_pattern="${PARENT_PATH//'/'/'\/'}" \
'BEGIN {print "Nr.\tSpace\tFolder"}
{sub(parent_path_pattern, ""); printf "%s)\t%s\n", NR, $0}'
)
{
while read -r user gpg_key; do
echo "$BODY" \
| gpg -ea -r "$gpg_key" \
| mail -s "Notify-Used-Disk-Space - $HOSTNAME" "$user"
done
} <'./users'
|