要xfs_quota -x -c 'limit bsoft=5g bhard=6g USER' /home
为USER
UID至少为每个$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
。在这里我使用双引号,因为我希望shell扩展$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
或通过某种其他方式执行生成的命令,则在输出的命令字符串中使用双引号(而不是单引号)不会以任何方式混淆shell 。如果让您感到困扰,只需在printf
上面的第一个参数中将单引号和双引号引起来。