意外标记“完成”错误附近的语法错误

意外标记“完成”错误附近的语法错误

#!/bin/bash

#!/bin/bash
while read email; do
    provider=$(echo $email | cut -d "@" -f 2)
    if [ ! -d $provder]; then
      mkdir $provider
    fi
    mv $email $provider
done < list.txt


 #bash sort.sh
sort.sh: line 8: syntax error near unexpected token `done'
'sort.sh: line 8: `done < list.txt

答案1

乍一看,存在三个明显的问题:

  1. $provder第4行拼写错误
  2. 第 4 行$provder和之间缺少空格]
  3. 未能对变量进行双引号。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?

和第四个问题:

  1. 使用 shell 循环处理文本。看为什么使用 shell 循环处理文本被认为是不好的做法?

    请改用 awk 或 perl。 Perl 可能是更好的选择,因为它mkdirrename内置的,而您必须使用system()awk 中的 fork 外部程序 mkdir 和 mv 。例如:

    perl -lne 'my ($username,$provider) = split /\@/;
    
               if (-e $provider) {
                 if (! -d $provider) {
                   warn "$provider exists but is not a directory";
                   next;
                 };
               } else {
                   mkdir $provider;
               };
    
               rename $_, "$provider/$_"' list.txt
    

    或者,使用 perl 重命名实用程序:

    rename 's/(.*)@(.*)/mkdir $2 || next; sprintf "%s\/%s", $2, $_/e' < list.txt
    

相关内容