Um den Befehl xfs_quota -x -c 'limit bsoft=5g bhard=6g USER' /homefür jeden Benutzer auszuführen, USERdessen 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 $userVariable erweitert , die Werte enthält, die von extrahiert wurden awk.
Ich benutze, ${ID_minimum:-1000}wenn ich der minVariablen im awkBefehl den Wert gebe . Dies wird auf den Wert von erweitert $ID_minimumoder darauf, 1000ob 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 evaloder 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 printfoben aus.