一、编写脚本的基本流程; 二、脚本的基础知识; 三、脚本中变量的应用; 一、编写脚本的基本流程; 1.shell脚本语言:帮助管理员实现批量化完成任务,结合计划任务实现自动化运维; 2.编写脚本的流程: a.创建目录,集中存放脚本文件; b.编写脚本内容; vi 脚本名.sh ##编辑脚本文件 #!/bin/bash ##声明解释器 #注释内容 ##可以注释些信息,方便后续查看 命令及控制语句 ##脚本的核心内容 :wq ##保存文件 c.赋予脚本文件执行权限:chmod +x 文件 d.运行脚本; 3.脚本的声明:声明使用哪种解释器,cat /etc/shells文件中的所有解释器都可以使用,解释器可安装; 4.执行脚本的方式: a.路径执行(必须有执行权限); 相对路径 绝对路径 b.source 脚本的绝对路径或相对路径(不需要执行权限); c.sh -x 脚本的路径(不需要执行权限),并且会显示命令和输出结果; 二、脚本的基础知识; 1. 重定向:改变了标准的输入输出状态; >:重定向输出到某个位置,替换原有文件的所有内容; >>:重定向追加输出到某个位置,在原有文件的末尾添加内容; <:重定向输入某个位置的文件; 2>:重定向错误输出; 2>>:重定向错误追加输出到文件的末尾; &>:混合重定向输出,正确错误的输出结果都会输出; 1,2>:同上; 2.管道符:将|前的命令的输出结果作为管道|后的命令的输入; 3.echo命令:返回结果并显示; 语法:echo [选项] "需要返回的值" 选项: 选项-e 若出现特殊字符则不将其转义,当普通字符对待; 在返回值中\n 代表强制换行、\t代表制表符; 内容中的选项:"内容\t内容" 插入tab "内容\n内容" 强制换行 三、脚本中的变量的应用; 1.概述:变量是一个筐,筐里装的是变量的值,只需要将筐带走,那么值也就随之带走,值为可变; 2.优点:简化输入,使脚本内容更加清晰,提高脚本的适用性; 3.分类:自定义变量、环境变量、位置变量、预定义变量; 4.自定义变量的定义: a.定义变量:变量名=变量值 b.查看变量:echo $变量名 c.使用变量:在命令中直接使用 $变量名 d.取消变量:unset 变量名 e.变量的作用范围: 局部变量:变量名=变量值,此种变量只能在当前bash中有效; 全局变量:export 变量名=变量值,此种变量在当前bash和当前子bash中有效; 注:可用 bash命令开启当前进程的子进程bash,exit退回到父bash进程; f.变量值中使用的括号: "":弱引用,会将双引号内的特殊符号与命令一起执行,例:A="ls -ld" '':强引用,会将单引号内的$、"、\等特殊符号失效,例:B="$A /etc/ ",B='$A /etc/'; ``:在定义变量时,引用命令,在值中引用变量等同于$(),''不可嵌套,$()可以嵌套;例:A=`du -sh /etc/` $():在定义变量时,引用命令,可以嵌套;例:AC=$(rpm -qf $(which rz)) 注:当变量值中包含'单引号时,应使用\'将单引号进行转义; g.变量名不能使用特殊符号,一般用大写字母和下划线; h.交互定义变量: read -p "提示文字信息" 变量的名称 提示文字信息:123 echo $变量名 123 5.环境变量的定义: a.环境变量设置用户工作环境,名称不能修改,值可以修改; b.环境变量的常用: PATH=设置外部命令的存放的路径,用冒号隔开 TMOUT=设置登录超时,单位为秒 HISTSIZE=设置历史命令记录的条数 LANG=设置语言环境(vi /etc/sysconfig/i18n 进行永久修改字符集) 注:设置临时环境变量时(注销就失效了):export PATH= c.环境变量的查看:env命令查看当前工作环境的所有环境变量; /etc/profile文件为用户每次登陆执行的的配置文件; 每个用户家目录中的.bash_profile是每个用户独立的环境变量配置文件; 6.位置变量和预定义变量: a.位置变量用于将脚本参数传递给脚本,有$1-$9,除命令或脚本本身外的所有; b.预定义变量:用户只能使用,不能创建,不能直接赋值; $0:为脚本本身或命令本身 $*:为脚本后的所有参数 $#:脚本参数数量统计 $?:上一条命令是否执行成功,返回值为0则成功,否则失败 注:在shell脚本中,所有的路径必须为绝对路径; ![]() 编写脚本: 使用母盘克隆一个虚拟机,并命名为shell脚本测试机。 一.练习脚本的基本编写流程: 1.确定任务及完成任务的命令 2.编写脚本整合任务 3.授权并测试执行 [root@www ~]# mkdir -p /root/bin [root@www ~]# cd /root/bin [root@www bin]# vi sysinfo.sh #!/bin/bash ##从/etc/shells中选择一个shell解析下面的内容 #by linuxfan #20160614 #system info. #我的第一个脚本,这是一个注释 #查看网络相关信息 ip a hostname cat /etc/hosts cat /etc/resolv.conf ip r #查看设备包括内存、cpu、磁盘等使用情况 cat /proc/cpuinfo lscpu cat /proc/meminfo |grep -i total free cat /proc/partitions df -hT ##查看进程和服务情况 ps aux |wc -l service --status-all chkconfig --list |grep 3:on :wq [root@www bin]# chmod +x sysinfo.sh ##授权 [root@www bin]# /root/bin/sysinfo.sh ##路径执行 [root@www bin]# sh -x sysinfo.sh ##测试时常用不需要执行权限 [root@www tmp]# source sysinfo.sh ##一般用于让配置文件生效等,不需要执行权限 二.变量及管道的使用: 1.使用变量,编写安装apache的脚本: [root@www bin]# vim install_httpd.sh #!/bin/bash #by fage 2016-01-14 #install apache httpd! #############download httpd##### HV=httpd-2.2.17 wget ftp://ftp.linuxfan.cn/tools/$HV.tar.gz -P /root ##########解压缩,并安装############# tar zxvf /root/$HV.tar.gz -C /usr/src/ >/dev/null cd /usr/src/$HV/ ./configure --prefix=/usr/local/httpd --enable-so --enable-cgi --enable-rewrite --enable-ssl&&make &&make install &>/dev/null :wq 以此类推,编写安装mysql及php的脚本 chmod +x install_httpd.sh /root/bin/install_httpd.sh ##执行脚本并安装 ls /usr/local/httpd 2.练习重定向和管道: [root@www bin]#ip a |grep eth0 |grep inet |awk {'print $2'} |awk -F '/' {'print $1'} [root@www bin]# vim hosts.sh #!/bin/bash #2016-01-14 by linuxfan ##设置hosts解析,为www.linuxfan.cn IP=$(ip a |grep eth0 |grep inet |awk {'print $2'} |awk -F '/' {'print $1'}) read -p "input FQDN:" NANE echo "$IP $NANE" >>/etc/hosts :wq [root@www bin]#sh -x hosts.sh [root@www bin]#cat /etc/hosts ![]() ![]() 特殊变量及脚本的综合应用 一.环境变量: [root@ns ~]# env ##查看所有的环境变量 [root@ns ~]# echo -e "1\n2" ##换行显示 [root@ns ~]# echo -e "1\t2" ##在1和2之间加入tab显示 [root@ns ~]# echo -e "$PATH\n $SHELL\n $HOSTNAME\n $MAIL\n $HISTSIZE\n\t $LANG" 注意:PATH为命令搜索路径,SHELL为当前用户使用的shell,HISTSIZE为历史命令记录条数,LANG当前使用的语言 [root@ns ~]# export ##查看全局环境变量定义情况 [root@ns ~]# export.UTF-8 ##设置语言,如果需要设置为中文将值改为zh_CN.UTF-8 [root@ns ~]# locale ##查看语言设置 [root@ns ~]# unset HISTSIZE ##取消环境变量HISTSIZE [root@ns ~]# vim /etc/DIR_COLORS ##修改第81,128行的值如下 81 DIR 01;43 128 .xz 01;32 :wq [root@ns ~]# tar Jcf changecls.xz /etc/hosts ; mkdir dir ##创建测试文件和目录 [root@ns ~]# exit ##注销系统,重新登录验证 [root@ns ~]# ls ##颜色已经变了 [root@ns ~]# echo "export TMOUT=300" >>/etc/profile ##设置登陆超时TMOUT为永久生效的环境变量,注意只有写入了文件的变量才是永久生效的 [root@ns ~]# source /etc/profile [root@ns ~]# sed -i 's/HISTSIZE=100/HISTSIZE=800/g' /etc/profile ##设置历史命令条数 [root@ns ~]# grep HIST /etc/profile |grep ^HI ##验证 [root@ns ~]# source /etc/profile [root@ns ~]# echo $HISTSIZE 总结:环境变量是为用户设置的工作环境参数的变量,修改时先测试,再写入文件。 二:位置变量和预定义变量: [root@ns bin]# vim position.sh ##编写并理解位置变量和预定义变量 #!/bin/bash echo "This is \$0:$0" echo "This is \$1:$1" echo "This is \$2:$2" echo "This is \$3:$3" echo "This is \$4:$4" echo "This is \$5:$5" echo "This is \$6:$6" echo "This is \$7:$7" echo "This is \$8:$8" echo "This is \$9:$9" echo "This is \$#:$#" echo "This is \$*:$*" echo "This is \$?:$?" echo "$0 is exec complete! " :wq [root@ns bin]# chmod +x position.sh [root@ns bin]# /root/bin/position.sh a b c d e f g h x y z [root@ns bin]# vim bak.sh #!/bin/bash TF="/opt/benfen-$(date +%F).tar.gz" tar zcf $TF $* 1>/dev/null echo "\$0:exec $0 script." echo "\$#:total bakup $#." echo "\$*:bakup $*" echo "30 12 * * 7 /root/bin/bak.sh $*" >>/var/spool/cron/root :wq [root@ns bin]# chmod +x bak.sh [root@ns bin]# /root/bin/bak.sh /etc/yum.repos.d/ /etc/sysconfig /etc/hosts ##备份,并观察$0,$#,$*的作用 三.编写MySQL备份脚本: 1.准备数据库: [root@www bin]# vim sql.sh ##在web服务器上编写该脚本, #!/bin/bash ## by linuxfan.cn 2016.1.1 mysql -uroot -p123123 <<END create database studydb; create database coursedb; grant select,lock tables on studydb.* to operator@'192.168.100.151' identified by '123123'; grant select,lock tables on coursedb.* to operator@'192.168.100.151' identified by '123123' show grants for operator@'192.168.100.151'; END :wq 请完成下列操作后再执行脚本: netstat -utpln |grep 3306 ##确认数据开启 mysql -uroot -p123123 ##能登录数据库 chmod +x sql.sh ##授权 在上述脚本中使用变量,将可能随着主机的IP,数据库名称,密码,用户名设置为变量后并替换掉相应的位置。 2.编写备份数据的脚本: 在ca服务器上完成: [root@ca ~]# mkdir bin [root@ca ~]# cd bin/ [root@ca bin]# vim dbbak.sh #!/bin/bash ## by linuxfan.cn ## 2016.1.1 mkdir /opt/dbbak/ /usr/bin/mysqldump -uoperator -p123123 -h 192.168.100.150 --databases coursedb >/opt/dbbak/coursedb-$(date +%F-%H:%M).sql >/dev/null /usr/bin/mysqldump -uoperator -p123123 -h 192.168.100.150 --databases studydb >/opt/dbbak/studydb-$(date +%F-%H:%M).sql >/dev/null /bin/tar Jcf /opt/dbbak/coursedb-$(date +%F-%H:%M).tar.xz /opt/dbbak/coursedb-$(date +%F-%H:%M).sql --remove &>/dev/null /bin/tar Jcf /opt/dbbak/studydb-$(date +%F-%H:%M).tar.xz /opt/dbbak/studydb-$(date +%F-%H:%M).sql --remove &>/dev/null :wq 请完成下列操作后再执行脚本: mount /dev/cdrom /mnt yum -y install mysql ##安装mysql客户端 mysql -uoperator -p123123 -h 192.168.100.150 ##登录测试 mysqldump -uoperator -p123123 -h 192.168.100.150 --databases studydb >test.sql;ls ##查看是否能成功备份 在上述脚本中使用变量,将用户,数据库名称,密码,主机IP,时间,备份后的sql文件名称,压缩文件的名称定义成变量,并替换相应的位置。 chmod +x dbbak.sh 脚本测试: sh -x dbbak.sh ls /opt/dbbak/ ##查看是否只有xz后缀的文件 测试成功后添加计划任务: echo "30 2 * * * /root/bin/dbbak.sh" >>/var/spool/cron/root ![]() |
|