#!/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つの明らかな問題があります。
$provder
4行目のスペルが間違っています。- 4行
$provder
と4行の間にスペースはありません。]
- 変数を二重引用符で囲むことができませんでした。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?
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