予期しない「完了」表示エラーの近くの構文エラー

予期しない「完了」表示エラーの近くの構文エラー

#!/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

一見すると、3つの明らかな問題があります。

  1. $provder4行目のスペルが間違っています。
  2. 4行$provderと4行の間にスペースはありません。]
  3. 変数を二重引用符で囲むことができませんでした。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?

4番目の質問は次のとおりです。

  1. シェルループを使用してテキストを処理します。バラよりシェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?

    代わりに awk または perl を使用してください。 Perlは組み込まれmkdirているので、おそらくより良い選択かもしれませんが、awkでフォーク外部プログラムmkdirとmvをrename使用する必要があります。system()たとえば、

    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
    

おすすめ記事