Pour exécuter la commande xfs_quota -x -c 'limit bsoft=5g bhard=6g USER' /home
pour chacun USER
dont 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 $user
variable qui contient les valeurs extraites par awk
.
J'utilise ${ID_minimum:-1000}
pour donner la valeur à la min
variable dans la awk
commande. Cela se développera à la valeur de $ID_minimum
, ou à 1000
si 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 eval
ou par d'autres moyens. Si cela vous dérange, permutez simplement les guillemets simples et doubles dans le premier argument printf
ci-dessus.