我一直在尝试编写一个命令(Solaris 服务器),将用户添加到特定组。这是一个相当长的命令,所以我将在此处发布整个命令,然后将其分解。
USER=myUser && sudo /usr/sbin/usermod -G `awk -v delim="," -F: '/[:,]'$USER'/ { groups = groups $1 delim; } END { groups = groups "myGroup"; print groups}' /etc/group` myUser
内在awk命令编译当前组的逗号分隔列表,外部命令在 -G 参数中获取此列表。
两个都awk和用户模式给出了语法错误(靠近第 1 行,但只有一行),但我感觉一个错误是由另一个错误引起的。
这里是否有我遗漏的明显语法错误?这可能是由 shell 问题引起的吗?作为免责声明,由于一些高级文本处理问题,我使用 && 构造而不是分号,但在我看来,这不会影响执行(我已经测试过了)。
答案1
awk
在 Solaris 上的工作方式不同– 中提供的版本/usr/bin
不支持该-v
选项。使用nawk
以获得更类似 POSIX 的版本。
第二个问题是,正如您已经注意到的,只有一行。如果不是绝对必要,请不要尝试编写一行代码;可读的命令更容易修复。如果您必须将命令放在某个配置文件中 - 请将其放在脚本中.sh
。
不要用作$USER
临时变量;许多程序都希望这个特定变量包含你的登录名。请选择类似名称$user
。
如果有工具可以帮你解析,就不要自己解析/etc/group
,比如groups
。(除了简化代码之外,它们还可以用于非本地账户。)
#!/bin/sh
user=myUser
group=myGroup
oldgroups=$(groups "$user" | sed "y/ /,/")
usermod -G "$oldgroups,$group" "$user"
或者如果你坚持
user=myUser && sudo usermod -G "$(groups "$user" | sed "y/ /,/"),myGroup" "$user"