예상치 못한 '완료' 표시 오류 근처의 구문 오류

예상치 못한 '완료' 표시 오류 근처의 구문 오류

#!/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. $provder4번째 줄의 철자가 틀리네요
  2. 4행 $provder과 4행 사이에 공백이 없습니다.]
  3. 변수를 큰따옴표로 묶지 못했습니다. 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?

네 번째 질문은 다음과 같습니다.

  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
    

관련 정보