stackoverflow 上的第一个问题,请告诉我我是否做错了什么。
我想收集管理组的成员并将它们与本地用户进行比较(通过 grep -v 排除一些帐户)。比较它们有点不起作用,因为它总是显示 2 个相同的字符串不相等。
我是脚本新手,并且严重依赖谷歌搜索来完成任何事情。我基本上尝试了通过谷歌在 stackoverflow 上找到的所有内容,但都无济于事,并回顾了类似的问题,所以虽然这似乎是一个反复出现的主题,但我不认为这是重复的?
所以这是脚本:
#!/bin/bash
localuser=$(ls /Users/ | grep -v "Shared\|admin\|.localized\|_appstore\|root")
localadmin=$(dseditgroup -o read admin | grep $localuser)
if [[ "$localadmin" == "$localuser" ]]; then
echo "true"
else
echo "false"
fi
如果我使用 od -c echo 这两个变量,我会得到以下输出:
0000000 m f r a n k \n
0000007
0000000 m f r a n k \n
0000007
使用 set -x (省略 -if/else)我得到以下结果:
++ ls /Users/
++ grep -v 'Shared\|admin\|.localized\|_appstore\|root'
+ localuser=mfrank
++ dseditgroup -o read admin
++ grep mfrank
+ localadmin=' mfrank'
+ echo mfrank
mfrank
+ echo mfrank
mfrank
在这里我可以清楚地看到 $localadmin 有两个 ' 和空格。它们从哪里来?我怎样才能摆脱它们?为什么这些没有用 od -c 显示?
非常感谢您的帮助。
编辑:
正确使用 OD 显示如下:
localadmin
0000000 004411 063155 060562 065556 0000010
localuser
0000000 063155 060562 065556 0000006
您面临的直接问题是因为
$localadmin
受到分词和全局扩展的影响,所以当您运行时,echo $localadmin | od
空格被删除。"$localadmin"
始终与引号一起使用,以防止您的数据被修改。当您有意想要从变量中删除空格时,可以使用
${localadmin//[[:space:]]/}
.对于您真正的问题,在 MacOS 上查找非 root 本地管理员用户的名称:
感谢 Ed Morton 对 awk 的帮助。:)
awk
没有循环的详细解决方案: