《1-22-跳出循环-shift左移-函数的使用和数据库自动备份脚本-v1.docx》由会员分享,可在线阅读,更多相关《1-22-跳出循环-shift左移-函数的使用和数据库自动备份脚本-v1.docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、本节所讲内容:q Shift参数左移指令q shell中函数使用方法q shell脚本实战:mysql自动备份和自动解压ZIP文件脚本第1章 Shift参数左移指令shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)在扫描处理脚本程序的参数时,经常要用到的shift命令,如果你的脚本需要10个或10个以上的参数,你就需要用shift命令来访问第10个及其后面的参数u 作用:每执行一次,参数序列顺次左移一个位置,$#的值减1,用于分别处理每个参数,移出去的参数,不再可用u 补充位置参数:位置参数, 从
2、命令行传递到脚本, 或者传递给函数, 或者set给变量$#命令行参数 或者位置参数的个数$*所有的位置参数都被看作为一个单词。 $*必须被引用起来$与$*相同,但是每个参数都是一个独立的引用字符串, 这就意味着, 参数是被完整传递的, 并没有被解释或扩展。这也意味着:参数列表中每个参数都被看作为单独的单词。$也应该被引用起来范例1:依次读取输入的参数并打印参数个数rootserver0 opt# cat 1.sh#!/bin/bashwhile $# != 0 ;doecho 第一个参数为:$1 ,参数的个数为:$#shiftdonerootserver0 opt# sh 1.sh a b c
3、 d e f g第一个参数为:a ,参数的个数为:7第一个参数为:b ,参数的个数为:6第一个参数为:c ,参数的个数为:5第一个参数为:d ,参数的个数为:4第一个参数为:e ,参数的个数为:3第一个参数为:f ,参数的个数为:2第一个参数为:g ,参数的个数为:1从上面结果可以看到: shift (shift 1)命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁之后的$2就变成了$1),而变量值提前一位。同理,shift n后,前n位参数都会被销毁,比如我们输入了5个参数为:a、 b、 c 、d、 e,那么对应的位置变量为:$1=a,$2=b,$3=c,$4=d,$5=e,我们
4、在执行shift 3之后,前面的3个参数a、b 、c会被销毁,就剩下了2个参数:d、e,这时对就的位置变量为:$1=d、$2=e, 其中d由$4$1,e由$5$2范例2:做一个加法计算器参数如右:11 17 23 84,对应的位置变量: $1 $2 $3 $4rootxuegod67 # cat 3.sh#!/bin/bash#首先确定有参数if $# -le 0 ;then echo 没有足够的参数存在 exit 124fisum=0while $# -gt 0 ;do sum=expr $sum + $1 shiftdoneecho $sumrootxuegod67 # sh 3.sh 1
5、1 17 23 84135第2章 shell函数使用方法函数:把一个功能封装起来。使用时直接调用函数名。 这样的脚本好处:模块化,代码可读性强。扩展性方便 语法如下:函数名 () 命令序列或:function 函数名() # function 可以不写命令序列注:函数调用时:不带()调用语法函数名 参数1 参数2 函数中的变量均为全局变量,没有局部变量函数的调用可以传递参数。在函数中用$1、$2来引用传递的参数范例4:定义一个函数,变量调用/mnt| cat fun-1.sh #!/bin/bashabc=123#define funexample()abc=456echo $abc#fune
6、xampleecho $abc/mnt| sh fun-1.sh 123456范例5:函数的参数传递/mnt| cat fun-2.sh #!/bin/bashdelete()rm -rf $1mkdir $2delete /mnt/mysql0.txt /mnt/xuegod-1705范例6:通过脚本调用其他模块中的函数我们调用函数是通过source这个命令来调用其他脚本中的函数那么我们现在对前面的作业再进行一下扩展,通过模块化来简化操作首先定义一个包含不同函数的功能模块/mnt| cat fun-moduels.sh #!/bin/bashdelete()rm -rf $decopy()c
7、p -rf $sdir $tdirbackup()tar zcf $tar_name $tar_dir & /dev/nullquit()exitdiskinfo()df -h写一个备份脚本,调用需要的模块/mnt| cat fun-3.shsource /mnt/fun-moduels.shwhile truedoclearcat$BAKDIR/$MYSQLDB.sqlcd $BAKDIR ; tar -czf $MYSQLDB.tar.gz *.sql#查找备份目录下以.sql结尾的文件并删除#find . -type f -name *.sql |xargs rm -rf #或find
8、. -type f -name *.sql -exec rm -rf ;#如何数据库备份成功,则打印成功,并删除备份目录30天以前的目录 $? -eq 0 & echo This $DATE Mysql_db BACKUP is SUCCESScd /data/backup/mysql_db/ ; find . -type d -mtime +30 | xargs rm -rfecho The mysql_db backup successfully 第4章 写脚本的一些注意的地方1、 建议大家把一些长命令分解成小的代码块,代码越短,越方便我们理解2、 将多个语句的开头和结尾排好顺序,原因是方
9、便我们查看语法结构,比如循环语句有没有正确开启和关闭if.fi3、 可以对多行语句进行代码缩进,这样显示的有层次和结构清晰4、 建议大家在写脚本的最好使用一致的格式5、 注释的使用第五章 扩展课后1、监控Web服务是否正常,有几种方法?2、监控db服务是否正常,有几种方法?方法:web服务和数据库1、 端口监控本地:netstat/ss/lsofrootxuegod67 # lsof -i :22 |grep sshd|wc -l3rootxuegod67 # ss -anptu|grep 22|wc -l3rootxuegod67 # netstat -anptu|grep 22|wc -l
10、32、远程:telnet/nmaprootxuegod67 # telnet 80Trying 111.13.100.92.Connected to .Escape character is .telnet quitConnection closed.rootxuegod67 # echo -e n |telnet 80|grep ConnectedConnected to .Connection closed by foreign host.rootxuegod67 # echo -e n |telnet 80|grep Connected|wc -lConnection closed by
11、 foreign host.1rootxuegod67 # nmap -p 80Starting Nmap 5.51 ( http:/nmap.org ) at 2016-11-05 18:27 CSTNmap scan report for (111.13.100.91)Host is up (0.012s latency).Other addresses for (not scanned): 111.13.100.92PORT STATE SERVICE80/tcp open httpNmap done: 1 IP address (1 host up) scanned in 0.28 s
12、econdsrootxuegod67 # nmap -p 80 |grep open|wc -l12、进程(本地)u 本地rootxuegod67 # ps -ef|grep mysqldroot 49401 1 0 19:15 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe -datadir=/var/lib/mysql -socket=/var/lib/mysql/mysql.sock -pid-file=/var/run/mysqld/mysqld.pid -basedir=/usr -user=mysqlmysql 49503 49401 1 1
13、9:15 pts/0 00:00:00 /usr/libexec/mysqld -basedir=/usr -datadir=/var/lib/mysql -user=mysql -log-error=/var/log/mysqld.log -pid-file=/var/run/mysqld/mysqld.pid -socket=/var/lib/mysql/mysql.sockroot 49522 48980 0 19:15 pts/0 00:00:00 grep mysqldrootxuegod67 # ps -ef|grep mysqld|wc -l3u 远程(wget/curl:htt
14、p方式,根据返回值进行判断)rootxuegod67 # wget -spider 开启 Spider 模式。检查是否存在远程文件。-2016-11-05 19:10:28- 正在解析主机 . 111.13.100.92, 111.13.100.91正在连接 |111.13.100.92|:80. 已连接。已发出 HTTP 请求,正在等待回应. 200 OK长度:277 text/html存在远程文件且该文件可能含有更深层的链接,但不能进行递归操作 - 无法取回。curl I URLrootxuegod67 # curl -I HTTP/1.1 200 OKServer: bfe/1.0.8.
15、18Date: Tue, 08 Nov 2016 08:25:33 GMTContent-Type: text/htmlContent-Length: 277Last-Modified: Mon, 13 Jun 2016 02:50:07 GMTConnection: Keep-AliveETag: 575e1f5f-115Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transformPragma: no-cacheAccept-Ranges: bytesu 也可以根据一些程序如数据库特有的标志返回值进行判断
16、范例8:下面以监控MYSQL服务为例进行一下说明rootxuegod67 mnt# cat 8.sh#!/bin/bash#本地端口#if netstat -anptu|grep 3306|awk -F : + print $5 = 3306 #if ps -ef|grep mysql|wc -l -gt 0 if netstat -anput|grep mysqld|wc -l -gt 0 #if lsof -i tcp:3306|wc -l -gt 0 #远程#if nc -w 2 192.168.1.67 3306 & /dev/null & echo ok |wc -l -gt 0 #if nmap 192.168.1.67 -p 3306 2/dev/null |grep open|wc -l -gt 0 then echo MySql is Running.else echo MySql is Stopped. /etc/init.d/mysqld startfi