#!/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
和之间缺少空格]
- 未能对变量进行双引号。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?
和第四个问题:
使用 shell 循环处理文本。看为什么使用 shell 循环处理文本被认为是不好的做法?。
请改用 awk 或 perl。 Perl 可能是更好的选择,因为它
mkdir
是rename
内置的,而您必须使用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