usermod + awk 语法无效

usermod + awk 语法无效

我一直在尝试编写一个命令(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"

相关内容