本例子来源于Linux shell Scripting Cookbook,自己简单注释下;
#!/bin/bash
#Description: Images downloader
#Filename: img_downloader.sh
# 校验参数个数 $# 代表参数个数, $0代表当前文件名称
if [ $# -ne 3 ]
then
echo "Usage: $0 URL -d DIRECTORY"
exit -1
fi
#循环解析参数
#也可以写成while格式的
#使用shift操作,直至参数不为空为止
#while [ -n "$0"]
#do
#case $1 in
# -d) shift;directory=$1;shift;;
# *) url=$1;shift;;
#esac
#done
for i in { 1..4}
do
case $1 in
-d) shift; directory=$1; shift ;;
*) url=${url:-$1}; shift;;
esac
done
mkdir -p $directory;
#通过正则表达式,把传入的含有url的String,截取未标准的Url
baseurl=$(echo $url | egrep -o "https?://[a-z.]+")
#curl -s 获取url内容,并且不打印提示信息
curl -s $url | egrep -o "<img src=[^>]*>" |
sed 's/<img src=\"\([^"]*\).*/\1/g' > /tmp/$$.list
sed -i "s|^/|$baseurl/|" /tmp/$$.list
cd $directory;
while read filename;
do
curl -s -O "$filename" --silent
done </tmp/$$.list
这里具体讲解下
egrep -o "<img src=[^>]*>"
egrep 相当与 grep -e 后面可以用正则表达式来索引内容。[^>]* 表示一直到不为 '>'的前面的所有的内容。这一步主要是把<img src="xxx" .. >这中内容提取出来。
sed 's/<img src=\"\([^"]*\).*/\1/g' > /tmp/$$.list
sed 后面跟的正则表达式格式 一般是 's/ \( \) /\1/g' ,其中 \1代表是前面第一个匹配上的正则表达式的引用,如果有多个就可以写成 's/\( \) \( \)/\1 \2/g' ,比如我们想把两个字母翻转 可以写成 echo 'ab' | sed 's/\(.\)\(.\)/\2\1/' 。
$$代表当前进程的id。把得到的结果放到$$.list中。
sed -i "s|^/|$baseurl/|" /tmp/$$.list
这句话的作用是把那些图片中以相对路径 '/'开头 替换成当前的上下文。
while read filename;
do
curl -s -O "$filename" --silent
done </tmp/$$.list
把$$.list中的url按行读到filename中,curl 后面跟的是-O 不是0。
转发标注来源 http://my.oschina.net/robinyao/blog/402068
END----------------------------------