Per eseguire il comando xfs_quota -x -c 'limit bsoft=5g bhard=6g USER' /home
per ciascuno il USER
cui UID è almeno $ID_minimum
, prendere in considerazione prima l'analisi di quegli utenti e quindi effettivamente eseguire il comando, piuttosto che provare a creare una stringa che rappresenta il comando che si desidera eseguire.
Se crei la stringa di comando, dovresti eval
farlo. È facile e sbagliato sbagliare. È meglio ottenere un elenco di nomi utente e quindi eseguire il comando.
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
Si noti che non è necessario effettivamente virgolette singole attorno all'argomento successivo -c
. Qui uso le doppie virgolette perché voglio che la shell espanda la $user
variabile che contiene i valori estratti da awk
.
Uso ${ID_minimum:-1000}
quando si dà il valore alla min
variabile nel awk
comando. Questo si espanderà al valore di $ID_minimum
, o a 1000
se quella variabile è vuota o non impostata.
Se lo volessi davvero , potresti fare in modo che il ciclo sopra stampi i comandi invece di eseguirli:
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
Notare ancora che l'uso di virgolette doppie nella stringa di comando emessa (anziché virgolette singole) non confonderebbe in alcun modo una shell se si dovessero eseguire i comandi generati usando eval
o attraverso altri mezzi. Se ti dà fastidio, scambia le virgolette singole e doppie nel primo argomento in printf
alto.