eval: syntax error at line 1: `then' unexpected
嗨,我对这个特殊的循环有问题,找不到解决方法,有什么想法为什么?
getent passwd | cut -f1 -d":" | sort -n | uniq -c |\ while read x ; do [ -z "${x}" ] && break set - $x if [ $1 -gt 1 ]; then gids=`getent passwd |\ nawk -F: '($1 == n) { print $3 }' n=$2 | xargs` echo "Duplicate Group Name ($2): ${gids}" fi done
最佳答案
如果通过shellcheck运行代码并更正它显示的错误(一个有问题的警告除外),代码将变成:
getent passwd | cut -f1 -d":" | sort -n | uniq -c |
while read -r x ; do
[ -z "${x}" ] && break
set - $x
if [ "$1" -gt 1 ]; then
gids=$(getent passwd | nawk -F: '($1 == n) { print $3 }' n="$2" | xargs)
echo "Duplicate Group Name ($2): ${gids}"
fi
done
代码似乎仍然有问题,其中一个问题是它寻找重复的用户名,但打印输出声称它找到了重复的组名。
我建议将上述内容替换为:
getent passwd | awk -F: '{c[$1]++; uids[$1]=uids[$1]" "$3} END{for (name in c) if (c[name]>1) printf "Duplicate User Name (%s):%s\n",name, uids[name]}'
awk代码的工作原理
在
getent passwd
的输出中,用户名将在字段1中,用户ID将在字段3中。c[$1]++; uids[$1]=uids[$1]" "$3
这将统计用户名
$1
出现的次数,并将计数保存在arrayc
中。它还保存与数组中每个名称关联的用户ID$3
。uids
在我们处理完getent的输出之后,这将查找计数大于1的用户名并打印信息。
建议代码的多行版本
getent passwd | awk -F: '
{
c[$1]++
uids[$1] = uids[$1] " " $3
}
END{
for (name in c)
if (c[name]>1)
printf "Duplicate User Name (%s):%s\n", name, uids[name]
}'
关于linux - 第1行的BASH语法错误:'then'不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38257914/