#!/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
언뜻 보면 세 가지 명백한 문제가 있습니다.
$provder
4번째 줄의 철자가 틀리네요- 4행
$provder
과 4행 사이에 공백이 없습니다.]
- 변수를 큰따옴표로 묶지 못했습니다. 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?
네 번째 질문은 다음과 같습니다.
쉘 루프를 사용하여 텍스트를 처리합니다. 바라보다쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?.
대신 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