我将 2 个参数传递给 bash 脚本。第一个参数是组,第二个参数是组 ID。
我想编写一个 bash 脚本来检查 /etc/group
中是否存在组。
如果不存在,则脚本应将组和 gid 添加到 /etc/group
中。
如果存在,那么它应该与第二个参数的 gid 匹配。如果 gid 与第二个参数不匹配,那么它应该用第二个参数覆盖 gid。
简而言之,我传递给脚本的组名称和 gid 应该位于/etc/group 文件中。
我运行命令为:
./addgroup.sh groupa 123
假设/etc/group
有一个条目:
groupa:x:345
运行命令后,当我浏览/etc/group
时,它应该有值
groupa:x:123
到目前为止我已经编写了以下addgroup.sh
:
if grep -q "^$1:" /etc/group
then
echo "group $1 exists:SUCCESS"
else
grep -q "^$1:" /etc/group || /bin/echo "$1:x:$2:" >> /etc/group
cat /etc/group
echo "group $1 added:SUCCESS"
fi
最佳答案
我相信这段代码满足您的需求并且更简单:
{ grep -v "^$1:" /etc/group; echo "$1:x:$2:"; } >/etc/group.tmp && mv /etc/group.tmp /etc/group
该问题表明您希望更新组 ID,即使组已存在。这里的代码具有该功能。
它是如何工作的:
grep -v "^$1:"/etc/group
这将删除组
$1
的现有定义(如果存在)。回显“$1:x:$2:”
这将使用正确的组 ID 添加回组
$1
的正确定义。{ ... } &&
mv/etc/group.tmp/etc/group
如果大括号中的命令成功执行,则会更新/etc/group。
保留现有群组成员
正如 sjnarv 指出的那样,人们可能希望保留现有的组成员。在这种情况下:
awk -v g="$1" -v id="$2" -F: -i inplace '$1 == g{save=$4; next} {print} ENDFILE{print g, "x", id, save}' OFS=: /etc/group
这需要 GNU awk。 (在 Ubuntu 上,GNU awk 可用,但通常不是默认值。)对于标准 awk:
awk -v g="$1" -v id="$2" -F: '$1 == g{save=$4; next} {print} END{print g, "x", id, save}' OFS=: /etc/group > /etc/group.tmp && mv /etc/group.tmp /etc/group
它是如何工作的:
-v g="$1"-v id="$2"
这里使用 shell 变量
$1
和$2
定义两个 awk 变量g
和id
。-F:
这告诉 awk 我们的字段分隔符是
:
。-i就位
这告诉 awk 就地修改文件(仅限 GNU awk)。
$1 == g{保存=$4;下一个}
如果我们在文件中遇到组
g
的现有定义,请将组成员(第四个字段)保存在变量save
中,然后跳过其余命令并跳转到next
行。这里,在 awk 脚本中,
$1
和$4
是代表该行的第一个和第四个字段的 awk 变量。这些变量完全独立,与代表 shell 脚本参数的 shell 变量$
和$4
无关。打印
对于
/etc/group
中的所有其他行,我们只是按原样打印它们。ENDFILE{print g, "x", id, save}
到达
/etc/group
末尾后,我们打印组g
的新定义以及组IDid
和组成员save
。 (对于标准 awk,我们使用 END 代替 ENDFILE。)OFS=:
这告诉 awk 使用
:
作为输出中的字段分隔符。
关于linux - 在/etc/group文件中修改正确的组名和ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45948795/