第1行的BASH语法错误:`then'独一无二

时间:2016-07-08 02:04:03

标签: linux bash solaris

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

1 个答案:

答案 0 :(得分:2)

如果您通过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出现的次数,并将计数保存在数组c中。它还会保存与数组$3中的每个名称相关联的用户ID uids

  • 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[$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]
    }'