一、shell脚本基础知识

1、编制第一个shell脚本

1)vim  first.sh

wKioL1gwB6viDUYwAAAr_1Eoy4g586.png


2)在脚本文件中输入如下内容

wKioL1gwB6uB6CDzAAAhoZ8RjJI134.png


3)设置执行权限并执行

wKiom1gwB6zw8OWNAABFgko8SAY515.png


2、为脚本添加注释,友好输出,更容易读懂。

1)vim  first.sh

wKiom1gwB62idDtcAABAXVTl9oU782.png


2)./first.sh执行脚本之后如下

wKioL1gwB62Aej-wAABP5vMtpn8970.png


3、重定向操作

1)>表示重定向输出,>>表示重定向追加

wKiom1gwB67BlJO_AABO7uqhvnA609.png


2)重定向输入,<表示重定向输入

Vim pass.txt,在文件中添加123456

然后执行passwd  --stdin jerry  < pass.txt

wKioL1gwB6-C8ZA0AABCWU505Jk754.png


3)错误重定向,可用来收集程序执行的错误信息,为排错提供依据,例如:执行以下操作可以将使用tar命令备份时出现的错误信息保存到error.log文件中

wKiom1gwB7Dy1WrlAABWDnXdlmA054.png


4)&>操作符可以将两类输出信息保存到同一个文件,例如,在编译源码包的自动化脚本中,若要忽略makemake install的操作的过程信息,可以将其定向到空文件/dev/null

首先下载httpd软件到本机,然后执行Vim httpd_install.sh,并输入如下内容:

wKioL1gwB7GgRowLAABC_nBV4qE572.png

设置权限chmod  +x  httpd_install.sh

最后执行./httpd_install.sh


4、管道操作

例子:使用grep命令查询使用/bin/bash作为shell的用户名称时,会输出符合条件的整行内容,在此基础上可以结合管道操作与Awk命令做进一步过滤,只输出用户名和登录shell列。

1)提取之前的正常效果

wKiom1gwB7HA53hpAABGUj4IuQM833.png


2)提取之后的效果,只显示用户名和shell

wKiom1gwCcaTsFURAAA2PJuE9lk896.png


3)再例如:显示磁盘已用的百分比

wKioL1gwCcfBSxsSAAAu89QNWa8143.png


二、使用shell变量

1、自定义变量:只在自己的shell环境中有效

1)定义新的变量和引用变量

Product=benet

Version=5.0

wKiom1gwCcewzurQAABTP1VsI_M241.png


2、变量赋值的特殊操作

1)双引号的作用:赋值的内容包含空格时,例如:

wKioL1gwCcfhhqtPAAA4lNvV-PA280.png


2)单引号的作用:赋值的内容中包含$,  ““” ,  \ 等具有特殊含义的字符时

wKiom1gwCcij9gaHAAAuJkMOz4o865.png


3)反撇号(`)的作用:用于将某个命令的输出结果赋值给变量,例如:

wKiom1gwCcjwDlGtAABAe-fkilU398.png


4)$()的作用:可以代替反撇号,解决嵌套问题,因为反撇号不能实现嵌套,例如:查询提供useradd命令程序的软件包所安装的配置文件位置.

wKioL1gwCcmz4CYpAAAyqS1KVhI805.png


5)read命令的作用:用来提示用户输入信息,例如:

wKioL1gwCcrBfLj-AABhnpdiUnE429.png


3、设置变量的作用范围

     新定义的变量只在当前shell有效,如果想进入新的shell环境同样有效,就需要使用export命令将变量导出为“全局变量”

wKiom1gwCcvQSh41AABEusNGs5w792.png


也可以在export导出全局变量的同时,也可以为变量赋值,例如:

wKioL1gwCcvjCPayAAAsqvKErpI672.png


4、变量的运算

wKiom1gwCyqjlMZcAABfBbXhDRg616.png

wKiom1gwCyrjHCkrAAAujCO4azw578.png


三、特殊的shell变量

1、环境变量

环境变量系统安装好了就存在,不用创建,可以直接使用,我们先查看一下:

wKioL1gwCyuza1OOAAA-QZvmc5c592.png


我们可以把脚本直接添加到$PATH搜索路径中去,这样执行脚本的时候就不用加./

wKiom1gwCyyyRiynAABH-3Q7D10014.png

wKioL1gwCy3i5gv9AACBhv859Ko342.png


环境变量的全局配置文件为/etc/profile,作用于所有用户,例如:将历史记录命令条数改为200条,只针对root用户

vim  /root/.bash_profile

wKioL1gwCy7zUPpmAABTEzaIOU8299.png


只需要添加上面的最后一行,然后执行source  /root/.bash_profile使之生效。

wKiom1gwCy-ynUxdAAAtVZx9w2g923.png


2、位置变量,例如求两个数的和

wKiom1gwCy_TAGukAAAkCY16wm0783.png

wKioL1gwCzChjMz5AAAn5DCUFbc252.png


3、预定义变量,系统安装好之后就有,不能创建,只能使用,例如:$#表示命令行中位置参数的个数,$*表示所有位置参数的内容,$?表示前一条命令执行后的返回状态,返回0表示正确。$0表示当前执行的脚本或程序的名称。

例如:制作备份数据脚本,vi mybak.sh

wKioL1gwCzDzA4h0AAA7kHud4FI880.png

 

执行脚本./mybak.sh,备份两个文件

wKioL1gwDXLTfnvnAAA8QyXe2BM545.png


查看备份结果

wKiom1gwDXLTVnLPAABLkZ7nuEY275.png


四、综合案例

1、实验目标:远程备份mysql服务器的数据库

2、实验环境:

一共2mysql服务器AB,在B上远程备份A上的数据库,在A上建立数据库googlebaidu,注意在防火墙上开启3306端口或者关闭防火墙,

3、实验拓扑:


wKiom1gwDXOxrRMEAABCoMWWq2I044.png

4、实验步骤

1)A上建立数据库

wKioL1gwDXOhf_uuAAAHDwVpNfo451.png


2)A上建立一个建立一个专用的数据库用户,这里我使用root账户,授予root账户对可以通过远程主机192.168.1.2连接A

wKioL1gwDXOBeebFAAAGHh53moU062.png


3)在备份主机B上备份测试

wKiom1gwDXTxV6B3AAAFDSqPhiI019.png


查看已经备份成功

wKiom1gwDXSy79e_AAAD4OeI0lk223.png


4)在备份主机B上编写脚本,之前需要创建备份目录 mkdir  -p  /opt/beifen

然后编写脚本vim  mysqlbak.sh

wKioL1gwDXTgtowsAAAZs385UqE945.png


5)执行备份脚本

wKiom1gwDXTABz_dAAACOtcn1ZM726.png

wKioL1gwDXTDiZ68AAAB2tUtjpY804.png


6)查看备份结果

wKioL1gwDXWg25LhAAADvzLNjyc930.png

5、设置计划任务

wKiom1gwDXXyDMt5AAAC5ws9uzc532.png


crontab  -e    这里为了测试方便,设置每分钟备份一次。

wKiom1gwDXXhHtxUAAADGfBPpp0703.png


两分钟在查看,发现备份文件增加,实验成功。

wKioL1gwDXXRVAx8AAAHMhQaOmI238.png