Pour exécuter la commande xfs_quota -x -c 'limit bsoft=5g bhard=6g USER' /homepour chacun USERdont l'UID est au moins $ID_minimum, envisagez d'abord d'analyser ces utilisateurs, puis exécutez réellement la commande, plutôt que d'essayer de créer une chaîne représentant la commande que vous souhaitez exécuter.
Si vous créez la chaîne de commande, vous devrez le faire eval. C'est délicat et facile de se tromper. Il est préférable d'obtenir simplement une liste de noms d'utilisateurs, puis d'exécuter la commande.
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
Notez qu'il n'y a aucun besoin réel de guillemets simples autour de l'argument après -c. Ici, j'utilise des guillemets parce que je veux que le shell développe la $uservariable qui contient les valeurs extraites par awk.
J'utilise ${ID_minimum:-1000}pour donner la valeur à la minvariable dans la awkcommande. Cela se développera à la valeur de $ID_minimum, ou à 1000si cette variable est vide ou non définie.
Si vous le vouliez vraiment , vous pourriez faire en sorte que la boucle ci-dessus imprime les commandes au lieu de les exécuter:
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
Notez à nouveau que l'utilisation de guillemets doubles dans la chaîne de commande émise (au lieu de guillemets simples) ne perturberait en aucun cas un shell si vous exécutiez les commandes générées à l'aide evalou par d'autres moyens. Si cela vous dérange, permutez simplement les guillemets simples et doubles dans le premier argument printfci-dessus.