BASH 第 1 行的语法错误:“then”不匹配

BASH syntax error at line 1: `then' unmatched

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 [  -gt 1 ]; then gids=`getent passwd |\ nawk -F: '( == n) { print  }' n= | xargs`     echo "Duplicate Group Name (): ${gids}" fi done

如果您 运行 通过 shellcheck 代码并更正它显示的错误(除了一个有问题的警告),代码将变为:

getent passwd | cut -f1 -d":" | sort -n | uniq -c |
while read -r x ; do
  [ -z "${x}" ] && break
  set - $x
  if [ "" -gt 1 ]; then
    gids=$(getent passwd | nawk -F: '( == n) { print  }' n="" | xargs)
    echo "Duplicate Group Name (): ${gids}"
  fi
done

代码似乎仍然存在问题,其中之一是它寻找重复的 user 名称,但打印输出声称它发现了重复的 group 名字。

我建议将上面的替换为:

getent passwd | awk -F: '{c[]++; uids[]=uids[]" "} 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[]++; uids[]=uids[]" "

    这会计算用户名 </code> 出现的次数,并将计数保存在数组 <code>c 中。它还保存与数组 uids.

  • 中的每个名称关联的用户 ID </code> <li><p><code>END{for (name in c) if (c[name]>1) printf "Duplicate User Name (%s):%s\n",name, uids[name]}

    处理完 getent 的输出后,这会查找计数大于 1 的用户名并打印信息。

建议代码的多行版本

getent passwd | awk -F: '
    {
        c[]++
        uids[] = uids[] " " 
    } 

    END{
        for (name in c) 
           if (c[name]>1) 
               printf "Duplicate User Name (%s):%s\n", name, uids[name]
    }'