因为之前的shell知识结构都非常凌乱,所以又重新学习了一遍,并且整理了一下笔记的内容。
下面的内容虽少而精,都是些很常用的shell脚本知识,个人感觉对于初学shell或者对于开发人员来说都是非常适用的,
可以收藏学习一下,一定会有很大收获!

[TOC]


shell编程(精华总结版)

一 shell简介

1 概念

​ 命令解释器

2 常见shell

bash    linux标准shell
sh      早期shell,较简单
csh ksh tcsh    unix  shellvi /etc/shells      linux支持的shell

3 shell脚本

例1:

#!/bin/bash
echo "hello world!"

脚本执行方式:

1)  赋予执行权限
路径执行    /root/shell/echo.sh
./echo.sh2)  bash  脚本名       脚本可以不赋予执行权限

4 bash常见功能

1)历史命令
默认保存1000条历史命令
vi  /etc/profile        修改环境变量配置文件,要生效,必须注销
HISTSIZE=1000           修改默认历史命令条数history         查询系统历史命令历史命令保存文件
~/.bash_historyhistory  -w         把内存中命令历史,保存入文件
history  -c         清空所有的历史命令重复历史命令
!n          重复第n条命令
!str        重复最后一个以str开头的命令
上箭头         调用上面的命令
2)别名
alias       查看系统中生效的别名alias  ls='ls  --color=never'   手工设定别名,临时生效vi  ~/.bashrc       写入别名,永久生效

5 输入输出重定向

标准输入     /dev/stdin       0                键盘
标准输出     /dev/stdout      1                显示器
标准错误输出 /dev/stderr      2                显示器#设备文件名      #文件描述符      #默认设备    
1)输出重定向

把应该输出到屏幕的输出,重定向到文件。

>   覆盖
>>  追加ls  >  aa       覆盖到aa
ls  >>  aa      追加到aals  gdlslga  2>>aa      错误信息输出到aa       强调:错误输出,不能有空格ls  &>aa            错误和正确都输入到aa掌握
ls  >> aa  2>>bb        正确信息输入aa,错误信息输入bbls  >>  aa  2>&1        错误和正确都输入到aa,可以追加2>&1    把标准错误重定向到标准正确输出

6 多命令顺序执行

1)命令1  ;  命令2 ; 命令3     命令123顺序执行。之间没有任何关系2)命令1  &&  命令2          命令1正确执行后,命令2才会执行3)命令1  ||  命令2          命令1执行不正确,命令2才会执行ls aa && echo "cunzai" || echo "bu cunzai!" 执行ls  aa,判断如果正确,输出“存在”。如果不存在,输出“不存在”

7 管道符

命令1  |  命令2         命令1的执行结果,作为命令2的执行条件netstat -tlun | grep 80                 查询监听的端口号,并查看80端口是否启动。
ls  -l  /etc/  |  more                  分屏显示ls内容
ls -l /etc/ | grep yum

二 变量

1 分类

本地变量
环境变量
位置参数变量
预定义变量

2 本地变量

1)声明        变量名=变量值     注意:=号左右不能有空格aa=123
2)调用echo  $变量名
3)查看变量set     查看所有变量,包括环境变量和本地变量
4)删除unset  变量名

3 变量设定规则

1)变量以等号连接值,等号不能有空格
2)变量名由数字和字母和下划线组成,不能以数字开头
3)变量值中有空格,用引号括起来
4)双引号内,有特殊字符。如$
5)单引号中特殊字符无含义
6)在变量值中,可以使用\转义符
7)变量值可以直接调用系统命令。    `命令`   $(命令)
8)变量值可以累加       aa=123    aa="$aa"456   echo $aa  --->123456
9)环境变量一般设为大写

4 环境变量

1)声明
export  变量名=变量值
export  aa

export的变量只能在当前bash进程及其子进程中生效。

2)查看
set              查看所有变量
env     export       只能查看环境变量declare      声明变量类型的,如果不特别声明,所有变量为字符串型
-i   声明为int
-x   声明为环境变量
3)删除
unset  变量名
4)常见环境变量
echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
系统查找命令的路径PATH="$PATH":/root/shell 在系统默认路径后,追加/root/shell目录作为命令查找路径
5)环境变量配置文件
/etc/profile
/etc/bashrc      所有用户生效(两个都是)~/.bashrc
~/.bash_profile  只对指定用户生效(两个都是)

5 位置参数变量

$0      命令自己
$1      第一个参数
$2      第二参数
$9      第九个参数

例2:输出位置参数变量,脚本后要接参数

#!/bin/bashecho "the  command  is  $0"
echo "canshu1  is  $1"
echo "canshu2 is $2"

6 预定义变量

$?      上一个命令的返回值。  0  上一个命令正确执行        非0  上一个命令不正确
$#      统计命令之后的参数个数
$*      返回所有参数
$n      位置参数变量

例3:输出预定义变量

#!/bin/bashecho "canshu  zongshu  $#"
echo "canshu liebiao: $*"
echo  $?

7 键盘读取命令

read  -p “提示信息” -t  等待时间   变量名

例子4:通过read读入变量值

#!/bin/bash
read -p "please input num1:" -t 30  test1
read -p "input num2:" -t 30  test2
sum=$(( $test1 + $test2))
echo “num1 +  num2 = $sum”

8 数值运算

变量值默认都是字符串型,要想进行数值运算。以下三种任选一种

1)declare方法
num1=123
num2=456
declare -i sum=$num1+$num22)sum=$(( $num1 + $num2 ))      推荐使用这一种3)sum=$(expr $num1 + $num2)     注意+左右必须空格4)运算符
+   -  \*  /  %取余

三 shell中常用命令

1 行提取命令grep

选项:     -v  反向选择-n  提取时,显示行号举例:grep  "[^a-z]hen"  test.txtoo前不是小写字母的行匹配。      注意:和开头没有关系grep  “\.$”   test.txt匹配以.结尾的行grep  "^[^A-Za-z]"  test.txt匹配不以字母开头的行         注意:所有字母不能这样写   A-zgrep  “^$”  test.txt匹配空白行grep  "oo*" test.txt匹配最少一个o

2 列提取命令

1)cut
cut  -d  “分隔符”  -f  提取列   文件名more /etc/passwd | grep "/bin/bash" | cut -d ":" -f 1,3
提取passwd文件中可以登录的用户的用户名和UID

cut的局限在于,如果指定空格作为分隔符,那么写多少个空格就以多少个空格作为分隔符,这样就无法把last命令的输出作为以空格作为分隔符来进行列的提取。

2)awk
awk  '条件 {动作}'
last | awk '{printf $1 "\t" $3 "\n"}'
提取last显示结果的第一和第三列
\t  tab键
\n  换行
\r  回车last | grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"|awk '{printf $1 "\t" $3 "\n"}'在last中提取包含ip的行,在行中提取第一和第三列awk内置变量     FS  指定分隔符
more /etc/passwd | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}'
读取passwd文件,以":"为分隔符,截取第一和第三列
BEGIN   在截取前使分隔符生效。如果没有BEGIN,那么第一行自定义的分隔符不生效
(当然使用-F':'来指定分隔符也是可以的)

6 echo命令

echo  -e  “输出内容”-e  识别格式化打印内容echo  -e  “1\t2\t3” 打印tab键echo  -e   "\e[1;31m  this is red text \e[0m"   输出红色字体\e[  格式1;31m  指定颜色0m  恢复颜色(重置)30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,36m=青色,37=白色echo  -e  "\e[1;42m  background  \e[0m"背景颜色:40m=黑色,41m=红色,42m=绿色,43m=黄色,44m=蓝色,45m=洋红,46m=青色,47m=白色

例子5:echo输出的小游戏

注:  cat  -A  文件名        显示文件隐,包括藏字符
取消dos文档的回车符,两种办法1) dos2unix  文档名2) vi  -b  文档
:%s/^M//g       ^M使用  ctrl+v+m  输入

例6:数据备份

#!/bin/bash
DAY=`date +%Y%m%d`#定义日期变量
SIZE=`du -sh /var/lib/mysql`#定义mysql目录大小的变量
echo "Date: $DAY" >> /tmp/dbinfo.txt#把日期输入信息文档
echo "Data Size: $SIZE" >> /tmp/dbinfo.txt#把大小输入信息文档
cd /opt/dbbak#切换目录
tar zcvf mysqlbak-${DAY}.tar.gz /var/lib/mysql /tmp/dbinfo.txt#打包备份mysql目录,同时打包信息文档
rm -f /tmp/dbinfo.txt

四 条件测试

test  测试条件  测试内容
[ 测试条件  测试内容 ]

1 测试文件类型

test  -e  文件名       测试文件是否存在,存在为真
[  -e 文件名  ]            注意:[]中必须有空格test  -f  文件名       判断是否是普通文件
test  -d  文件名       判断是否为目录
test  -b  文件名       判断是否为块设备文件
test  -c  文件名       字符设备文件

2 测试文件权限

test  -r  文件名       判断是否有可读权限
test  -w  文件名       可写
test  -x  文件名       执行
test  -s  文件名       判断是否为非空白,有内容为真

3 两个文档比较

[ file1  -nt  file2 ]   file1是否比file2新
[ file1  -ot  file2 ]   file1是否比file2旧
[ file1  -ef  file2  ]  file1与file2是否是链接文件

4 两个数值之间判断

[ n1  -eq  n2 ]     n1和n2是否相等
[ n1  -ne  n2 ]     n1和n2是否不等
[ n1  -gt  n2 ]     n1大于n2
[ n1  -lt  n2 ]     n1小于n2
[ n1  -ge  n2 ]     n1大于等于n2
[ n1  -le  n2 ]     n1小于等于n2

5 判断字符串

[ -z  字符串 ]     判断字符串是否为空[ 字符串1  ==  字符串2 ]  判断字串1 是否与字串2相等
[ $aa == $bb ] && echo 1 || echo 2[ 字符串1  !=  字符串2 ]  判断字串是否不等

在判断某个变量是否等于某个常量字符串时,一般使用 "$str" == "hello" 这样的方式,即加上双引号。

6 多重判断

-a      逻辑与[ -z $file -a -e $file ]
-o      逻辑或 !       逻辑非

例子7:判断输入的文件类型和文件权限

#!/bin/bashecho -e "nide wenjian shifou cunzai? wenjian quanxian shi shenme? \n\n"read -p "please input filename:" -t 30 filenametest -z $filename && echo "please input filename!!" && exit 1#-z  变量 判断字符串是否为空,为空为真test !  -e $filename && echo "wenjian bucunzai!" && exit 2#-e  变量 判断文件是否存在,存在为真       !  逻辑非test -f $filename  &&  filetype=putong#-f     是否为普通文件
test -d $filename && filetype=mulu#-d     是否为目录
test -r $filename && perm="read"#-r     是否有可读权限
test -w $filename && perm="$perm  write"#-w 是否可写
test -x $filename && perm="$perm executable"#-x 是否可执行echo -e "the filename is : $filename \n"#打印文件名
echo -e "filetype is : $filetype \n"#打印文件类型
echo -e "permision is : $perm \n"#打印文件权限

五 流程控制

1 if语句

1)if条件语句-- 单分支

当“条件成立”时执行相应的操作,格式:

if  条件测试命令 then   命令序列
fi

例子8:如果/boot分区的空间使用超过80%,则输出警告

#!/bin/bash
RATE=`df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f1 `
if  [  $RATE  -gt  80  ]
thenecho "Warning,/boot DISK is full!"
fi
2)if条件语句 -- 双分支

当“条件成立”、“条件不成立”时执行不同操作,格式:

if  条件测试命令then   命令序列1else   命令序列2
fi

例子9:判断httpd服务是否启动,如果没有启动则启动

#!/bin/bash
http=`netstat -tlun  | awk '{print $4 "\n"}' | grep ":80$"`
(或http=$( ps aux | grep httpd | grep -v grep))if  [ -z "$http" ]thenecho "httpd  meiyou qidong!"/etc/rc.d/init.d/httpd startelseecho "httpd runing"
fi
3) if条件语句 -- 多分支

格式:

if  条件测试命令1  ;  then命令序列1
elif  条件测试命令2  ;  then命令序列2
elif  ...
else命令序列n
fi

例子10:

#!/bin/bash
echo "if you want to beijing ,please input 1"
echo "if you want to shanghai ,please input 2"
echo "if you want to chengdu ,please input 3"read -p "please input a num: " -t 30 numif [ "$num" == "1" ]thenecho "beijing!!!"
elif [ "$num" == "2" ]thenecho "shanghai!!!!"
elif [ "$num" == "3" ]thenecho "chengdu!!!"
elseecho "error,please input 1 or 2 or 3."
fi

2 for语句

1)使用in关键字循环

根据变量的不同取值,重复执行一组命令操作,格式:

for  变量名  in  取值列表
do命令序列
done 

例子11:循环

#!/bin/bashfor time in morning noon afternoon eveningdoecho $timedone

例子12:输入目录名,显示目录下所有内容.

#!/bin/bashread -p "please input a filename!" -t 30 filenameif [ -z $filename ];thenecho "please input!!!!!!"exit 1
fi
#如果字符串为空,报错跳出if [ ! -e $filename ]thenecho "$filename not cunzai!!"exit 2
fi
#如果文件不存在,报错跳出if [ ! -d $filename ]thenecho "$filename is not driectory"exit 3
fi
#如果不是目录,报错跳出file=`ls $filename`for test in $filedoecho $testdone
2)数值加加循环

例子13:

#/bin/bashs=0
for ((i=1;i<=100;i=i+1))
dos=$(($s+$i))
done
echo $s

3 while循环语句

重复测试指定的条件,只要条件成立则反复执行对应的命令操作,格式:

while  命令或表达式
do命令列表
done

例子14:批量添加用户

#!/bin/bash
i=1
while  [  $i  -le  20  ]
douseradd stu$iecho "123456" | passwd --stdin stu$i &> /dev/nulli=`expr $i + 1`
done

例子15:批量删除用户

#!/bin/bashaa=`cat /etc/passwd | grep "/bin/bash"|grep -v "root"|cut -d ":" -f 1`for i in $aadouserdel -r $idone

例子16:批量添加

#!/bin/bashaa=10for ((i=1;i<=$aa;i=i+1))douseradd stu$iecho "123456" | passwd --stdin  stu$i &> /dev/nullecho $idone

4 case多重分支语句

根据变量的不同取值,分别执行不同的命令操作。

例子17:打印选择列表,输出选择

#!/bin/bash
echo -e  "shanghai: 1\n"echo -e  "beijing: 2\n"echo -e  "chengdu: 3\n"read -p "input your choice:" -t 30  choicase $choi in"1")echo "shanghai!!!";;"2")echo "beijing!!!";;"3")echo "chengdu!!!";;*)echo "qing chongxin  shuru!";;
esac

六 apache启动脚本分析

#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
#自启动设定  -代表自启动级别,85(S85)代表启动序号,15(K15)代表关闭序号。
# description: The Apache HTTP Server is an efficient and extensible  \
#              server implementing the current HTTP standards.
#服务描述。以上两行用于apache自启动。
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd/httpd.pid
#
### BEGIN INIT INFO
# Provides: httpd
# Required-Start: $local_fs $remote_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: distcache
# Short-Description: start and stop Apache HTTP Server
# Description: The Apache HTTP Server is an extensible server
#  implementing the current HTTP standards.
### END INIT INFO
#以上都是注释。# Source function library.
. /etc/rc.d/init.d/functions
#"."其实就是source,就是调用functions文件。if [ -f /etc/sysconfig/httpd ]; then. /etc/sysconfig/httpd
fi
#判断httpd如果是文件,则调用httpd文件。# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
#定义变量HTTPD_LANG的值。并追加变量的值为C,即英文。# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
#定义一系列变量,用于后面的执行。
RETVAL=0
#定义全局命令返回变量。
STOP_TIMEOUT=${STOP_TIMEOUT-10}# The semantics of these two functions differ from the way apachectl does
# things -- attempting to start while running is a failure, and shutdown
# when not running is also a failure.  So we just do it the way init scripts
# are expected to behave here.
start() {echo -n $"Starting $prog: "LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONSRETVAL=$?echo[ $RETVAL = 0 ] && touch ${lockfile}return $RETVAL
}
#定义start函数,用于apache的启动。
#如果守护进程/usr/sbin/httpd 启动成功($RETVAL = 0),就建立/var/lock/subsys/httpd文件(touch #${lockfile})。通过$httpd变量执行/usr/sbin/httpd命令启动apache。通过$pidfile变量调用apache
#的PID。通过变量$OPTIONS定义命令执行时的初始化环境配置,依赖/etc/sysconfig/httpd文件。# When stopping httpd, a delay (of default 10 second) is required
# before SIGKILLing the httpd parent; this gives enough time for the
# httpd parent to SIGKILL any errant children.
stop() {echo -n $"Stopping $prog: "killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpdRETVAL=$?echo[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
#定义stop函数,用来关闭apache服务,关闭服务之后会删除pid文件。
reload() {echo -n $"Reloading $prog: "if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; thenRETVAL=6echo $"not reloading due to configuration syntax error"failure $"not reloading $httpd due to configuration syntax error"else# Force LSB behaviour from killprocLSB=1 killproc -p ${pidfile} $httpd -HUPRETVAL=$?if [ $RETVAL -eq 7 ]; thenfailure $"httpd shutdown"fifiecho
}
#定义reload函数,用于apache的重新加载。
#通过/usr/sbin/httpd –t命令判断apache的配置文件。如果配置文件报错,则输出错误提示。如果配
#置文件正确,则重新加载apache。# See how we were called.
case "$1" in
#判断执行脚本后的第一个参数的值,$1表示执行脚本时的第一个参数。start)start;;;;
#如果参数值为start,则调用start函数。stop)stop;;
#如果参数值为stop,则调用stop函数。status)status -p ${pidfile} $httpdRETVAL=$?;;
#如果参数值为status,则执行status –p $httpd命令测试apache状态。restart)stopstart;;
#如果参数值为restart,则先调用stop函数,再调用start函数condrestart|try-restart)if status -p ${pidfile} $httpd >&/dev/null; thenstopstartfi;;
#如果参数值为condrestart或try-restart,则只有apache服务是已经运行时才先调用stop函数,再调
#用start函数,重启apache。如果apache服务没有运行,则不重启apache。force-reload|reload)reload;;
#如果参数值为force-reload或reload,则调用reload函数。graceful|help|configtest|fullstatus)$apachectl $@RETVAL=$?;;
#如果参数是graceful或help或configtest或fullstatus,则执行/usr/sbin/apachectl命令,并把参
#数作为命令的参数传入apachectl命令。*)echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"RETVAL=2
#如果输出的参数不是以上任何参数,则输出错误信息
esacexit $RETVAL

shell编程(精华总结版)相关推荐

  1. Shell编程入门(第二版)(中)

    变量测试语句-test 作用:用来测试变量是否相等,是否为空,文件类型等. 格式: test 测试条件 或 [] #范围:整数,字符串,文件 1)整数测试: test int1 -eq int2  测 ...

  2. Shell编程入门(第二版)(下)

    流程控制语句 三.select/in[较少用] 格式: [python] view plaincopy select [变量] in [关键字] do command 1 ... ... comman ...

  3. Shell编程入门(第二版)(上)

    简单的示例Shell程序 示例1. #!/bin/bash #This is to show what a shell script looks like echo "Our first e ...

  4. 《Linux Shell编程从初学到精通(第2版)》pdf

    下载地址:网盘下载 内容简介 编辑 shell是用户与内核进行交互操作的一种接口,是linux最重要的软件之一.目前最流行的shell称为bash shell,bash shell脚本编程以其简洁.高 ...

  5. 【编程实践】Linux / UNIX Shell编程极简教程

    不同于一般的介绍Linux Shell 的文章,本文并未花大篇幅去介绍 Shell 语法,而是以面向"对象" 的方式引入大量的实例介绍 Shell 日常操作,"对象&qu ...

  6. Shell编程(week4_day1)--技术流ken

    本节内容 1.shell简介 2. shell分类 3. 查看shell 4. 第一个shell脚本 5. shell编程常用命令   5.1 grep   5.2 cut   5.3 sort   ...

  7. Linux Shell 编程学习总结

    Shell 教程 Shell简介:什么是Shell,Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成 ...

  8. Shell 编程快速入门

    什么是Shell脚本? Shell脚本(英语:Shell script)是一种电脑程序与文本文件,内容由一连串的shell命令组成,经由Unix Shell直译其内容后运作.被当成是一种脚本语言来设计 ...

  9. Windows Shell 编程 第六章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987951】...

    第六章 快捷方式的最短路径 Windows Shell允许存储任何对象的引用到系统范围内的任何地点.例如,当你从一个文件夹拖拽可执行程序到另一个文件夹时,鼠标自动改变形状给出除拷贝和移动文件之外的第三 ...

  10. python核心编程第三版_《Python核心编程(第3版)》

    <Python核心编程(第3版)>是经典畅销图书<Python核心编程(第二版)>的全新升级版本,本书适合具有一定经验的Python开发人员阅读,总共分为3部分.第1部分为讲解 ...

最新文章

  1. 基于特征点匹配的自适应目标跟踪算法
  2. 随机森林与梯度提升树
  3. linux oracle bad elf,oracle11g安装到red hat6.2 64位系统报错:/lib/ld-linux.so.2: bad ELF interpreter...
  4. c语言数据结构五子棋实验报告,数据结构课程设计-五子棋
  5. C#中采用SHA1或MD5加密字符串的函数
  6. python程序设计与应用第4章实验
  7. java常用方法名_Java语言常见名称有哪些
  8. Rails测试《十》不能错过的杂七杂八
  9. 决策引擎中的Hunter类策略又是什么?
  10. C.Fountains(Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)+线段树+RMQ)...
  11. Qt lambda 简化你的代码 connect 写法示例 省略槽函数定义
  12. OrCAD(三)电路仿真
  13. 概率的意义:随机世界与大数法则
  14. Fundamentals Of Computer Graphics (4th Ed)
  15. MySql join 详解
  16. 秋招总结帖,还愿牛客
  17. 把握大都市的高度和速度
  18. DW 6 CS6 通用破解方法
  19. 如何将AVIF格式转换为PNG格式
  20. video.js视频高度自适应解决方法

热门文章

  1. 软件工程概论网站系统开发基础及目标概述
  2. .NET开发设计模式-获取某个接口下面所有的派生类
  3. 关于宏定义的一些用法
  4. DevExpress 小结
  5. 嵊州D1T1 总统先生,一路走好!
  6. 爬虫—分析Ajax爬取今日头条图片
  7. HDU 1181.变形课-并查集
  8. hdwiki 学习笔记 01
  9. angulrar知识点整理
  10. caffe的Matlab接口的使用方法