Um den Befehl xfs_quota -x -c 'limit bsoft=5g bhard=6g USER' /home
für jeden Benutzer auszuführen, USER
dessen UID mindestens lautet $ID_minimum
, sollten Sie zuerst diese Benutzer analysieren und dann den Befehl tatsächlich ausführen , anstatt zu versuchen, eine Zeichenfolge zu erstellen, die den Befehl darstellt, den Sie ausführen möchten.
Wenn Sie die Befehlszeichenfolge erstellen, müssten Sie sie erstellen eval
. Das ist fummelig und leicht falsch zu verstehen. Es ist besser, nur eine Liste der Benutzernamen abzurufen und dann den Befehl auszuführen.
getent passwd |
awk -F: -v min="${ID_minimum:-1000}" '$3 >= min && $1 != "nfsnobody" { print $1 }' |
while IFS= read -r user; do
xfs_quota -x -c "limit bsoft=5g bhard=6g $user" /home
done
Beachten Sie, dass für das nachfolgende Argument keine einfachen Anführungszeichen erforderlich sind -c
. Hier verwende ich doppelte Anführungszeichen, weil ich möchte, dass die Shell die $user
Variable erweitert , die Werte enthält, die von extrahiert wurden awk
.
Ich benutze, ${ID_minimum:-1000}
wenn ich der min
Variablen im awk
Befehl den Wert gebe . Dies wird auf den Wert von erweitert $ID_minimum
oder darauf, 1000
ob diese Variable leer oder nicht festgelegt ist.
Wenn Sie wirklich wollten, können Sie die Befehle in der obigen Schleife ausdrucken lassen, anstatt sie auszuführen:
getent passwd |
awk -F: -v min="${ID_minimum:-1000}" '$3 >= min && $1 != "nfsnobody" { print $1 }' |
while IFS= read -r user; do
printf 'xfs_quota -x -c "limit bsoft=5g bhard=6g %s" /home\n' "$user"
done
Beachten Sie erneut, dass die Verwendung von doppelten Anführungszeichen in der ausgegebenen Befehlszeichenfolge (anstelle von einfachen Anführungszeichen) eine Shell in keiner Weise verwirren würde, wenn Sie die generierten Befehle mit eval
oder auf andere Weise ausführen würden . Wenn es Sie stört, tauschen Sie einfach die einfachen und doppelten Anführungszeichen im ersten Argument nach printf
oben aus.