代码传送
欢迎大家转载,转载请注明出处,谢谢!
-
原理:
主要就是采用curl命令采集网页html源码,然后利用正则表达式和grep、`sed`等工具对网页源码进行剪切和筛选,最终找到图片下载链接,最后用wget进行下载。 -
知识准备:
这里简单介绍一些基本知识,本人也只是现用现查,更多用法请查询man手册
man xxx
。-
bash 基础语法:
-
美元符号(
$
):用来取值,取变量的值:num=$i
(取变量i的值赋值给num
变量)、取数组的值:nums=${a[${i}]}
(取a[i]
的值赋值给nums
变量)、取命令的值:total=$(last | awk NF | grep -v 'system' | grep -v 'wtmp' | cut -d ' ' -f 1 | uniq -c)
(取小括号里面命令的最终执行结果的输出数据赋值给total
变量)。 -
数学运算:本人比较喜欢小括号的方式:
num=0 ((num++)) num=$((num + 1)) for ((i = 0; i < num; i++)); do echo "i = ${i}" done
-
双引号和单引号:
二者都是将字符串引起来,但是双引号里面可以使用bash的关键字、特殊字符、转义字符等,而单引号就是将所有的字符都视为字符本身,没有其他意义,变成了单纯的字符串。
-
取值符**`**:
这个符号在
Tab
键上面,上面说过美元符号后面用小括号可以取一个命令的执行结果,除了这种方式还可以用取值符号:total=`last | awk NF | grep -v 'system' | grep -v 'wtmp' | cut -d ' ' -f 1 | uniq -c`
-
字符串操作:
str="123456" echo ${str:0:3} # 取str的从0开始到3的子串 echo ${str:(-3)} # 取str的从末尾开始往前长度为3的子串
-
为脚本增加参数:
当我们使用linux命令的时候会经常在命令后面加上各种各样的参数,C语言接收参数是在主函数后面的括号里,而我们bash脚本接收命令行参数的方式是
$0
、$1
、$@
、$#
等等:$0
变量存储着脚本名称加上路径$1
变量存储着第一个变量以此类推$@
变量存储着所有的变量以回车分隔$#
变量也是存储所有变量,但是确是所有变量已空格分隔转换成的字符串,是一个完整的字符串。
a=$1 b=$2 c=$3 ... for arg in `$@` do echo "${arg}" done echo "all arg : $#"
-
echo
:该命令是回显,可以把后面的内容输出到标准输出,有两个常用的参数:
-n
和-e
:# 加上-e参数后,后面的字符串中可以使用转义字符 # echo 默认自动换行,加上-n参数后不默认结尾换行 echo -en "\033[1;31m\tERROR\n\033[0m"
-
管道:
管道是unix哲学的体现之一,unix哲学强调小而美,小的东西更加灵活,每个程序只需要专注的做好一件事并给出统一接口。我们经常会看到两个命令中间有一个
|
符号,管道可以把管道前面的程序的标准输出作为后一个程序的标准输入。这样我们就可以灵活的运用几个简单的命令完成复杂的工作。last | awk NF | grep -v 'system' | grep -v 'wtmp' | cut -d ' ' -f 1 | uniq -c
-
分之语句-
if
:用法举例:
# if Command;then # Command; # fi # eg. # 判断部分我们常用test表达式。 # 数值判断: num = 0 if [[ ${num} -eq 0 ]]; then echo "num = 0" elif [[ ${num} -en -1 ]];then echo "num != -1" elif [[ ${num} -gt 0 && ${num} -le 5 ]];then echo "num > 0 && num <= 5" elif [[ ${num} -ge 6 && ${num} -lt 10 ]];then echo "num >= 6 && num < 10" else echo "num = ${num}" fi # 字符串判断: name="sunowsir" if [[ "x${num}" == "x" ]];then echo "name is NULL" elif [[ ${num} != "sunowsir" ]];then echo "name : ${name}" else echo "name : sunowsir" fi
-
分之语句-
case
:用法举例:
# case 用美元符号取值的变量/数组/命令 in # 判断值) # command # ;; # ... # esac eg. case ${para[${i}]} in "-u" | "--url" | "--URL" | "--Url") ((i++)) source_url=${para[${i}]} ;; "-p"| "--path" | "--Path" | "--PATH") ((i++)) save_path=${para[${i}]} ;; "-s" | "--suffix" | "--Suffix" | "--SUFFIX") ((i++)) suffix=${para[${i}]} ;; "-n" | "--name" | "--Name" | "--NAME") ((i++)) search_name=${para[${i}]} ;; "-w" | "--word" | "--Word" | "--WORD") ((i++)) add_word=${para[${i}]} ;; *) echo "please use --help to get help information." ;; esac
-
循环语句-
for
:用法举例:
# for Variable in 用美元符号取值的变量/数组/命令,以回车分隔; # do # Command; # done # for ((i = 0; i < max; i++)); # do # Command; # done for arg in $@ do echo ${arg} done for ((int i = 0; i < 10; i++)); do echo ${i} done # break和continue 和C语言一样使用
-
wait
:等待上一个命令执行结束。
-
-
常用工具:
-
date
:输出格式化时间date +"%Y-%m-%d %H:%M:%S" # 输出 ------------------- 2018-10-18 11:53:08
-
touch
:常用来创建一个新的空白文件 -
grep
:数据筛选工具:-E
使用扩展正则表达式。-o
只显示匹配到的内容-I
忽略二进制文件-v
输出不匹配的内容-a
将二进制文件当做普通文件读取-H
显示匹配到的字符串在该字符串所在文件中的行号-h
不显示上述的行号。
-
sort
:排序工具,常用参数如下:-t
定义分隔符-k
以上述分隔符分隔的第几部分为标准排序-n
根据字符串数值进行比较。-c
检查输入是否已排序,若已有序则不进行操作-u
配合-c,严格校验排序;不配合-c,则只输出一次排序结果
-
dirname
:返回以
/
为分隔的字符串的除了最后一部分的剩下的部分,在脚本中通常用来使用$0
求脚本所在位置。 -
basename
返回以
/
为分隔的字符串的最后一部分,通常用来求当前目录的名称。 -
tr
:字符批量替换工具# tr [选项]... SET1 [SET2] # eg. echo "192/168/1//108" | tr -s '/' '.'
-
cut
:字符串切割工具# cut [选项]... [文件]... # eg. echo "192/168/1//108" | tr -s '/' '.' | cut -d '.' -f 1
-
sed
:流式文本编辑器# sed [选项]... {脚本(如果没有其他脚本)} [输入文件]... # eg. ls -a | nl | sed 's/^\s*//g'
-
curl
和wget
:用来获取网页HTML
源码和下载文件,用法请自行查询man
手册:man curl
、man wget
-
-