UIDが少なくともであるxfs_quota -x -c 'limit bsoft=5g bhard=6g USER' /homeそれぞれUSERに対してコマンドを実行するには、実行するコマンドを表す文字列を作成するのではなく、$ID_minimumまずそれらのユーザーを解析してから実際にコマンドを実行することを検討してください。
コマンド文字列を作成する場合は、evalそれを行う必要があります。これは手間がかかり、間違いやすいです。ユーザー名のリストを取得して、コマンドを実行することをお勧めします。
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
後の引数を一重引用符で囲む必要は実際にはないことに注意してください-c。ここでは二重引用符を使用してい$userます。これは、によって抽出された値を含む変数をシェルで展開するためですawk。
コマンドで変数に${ID_minimum:-1000}値を与えるときに使用しminますawk。これは、の値$ID_minimum、または1000その変数が空であるか設定されていない場合に展開されます。
本当にしたい場合は、上記のループでコマンドを実行する代わりにコマンドを出力することができます。
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
出力されたコマンド文字列で(一重引用符の代わりに)二重引用符を使用しても、生成されたコマンドをeval他の方法で実行した場合、シェルが混乱することはありません。気になる場合は、printf上記の最初の引数で一重引用符と二重引用符を入れ替えてください。