shell脚本应用
理论部分:
随着企业的应用越来越多,服务器的自动化管理也是越来越重要,在linux中提供了一个非常强大的功能,这种功能名字为shell脚本,什么是shell脚本。
我们都知道我们所输入的命令计算机是不识别的,这时就需要一种程序帮助我们进行翻译,变成计算机所识别的二进制程序,同时又将计算机所执行的结果翻译给我们linux的shell脚本是一种特殊的应用程序,常见的shell解释器有很多种使用不同的shell时期内部指令命令提示方式方面会存在一些区别,可以通过/etc/shells文件查看
图1
其中/bin/bash是大多数linux中默认的shell脚本。BASH全称为Bourne Again shell,时最受欢迎的开源项目之一,之后的所有脚本的编写都是bash脚本
什么是脚本,简单的说,就是将平时的操作命令顺序的放入到文件中赋予执行权限,一次的执行我们来编写第一个脚本frist.sh
linux不以后缀名区分文件,为了方便记忆这里我就以.sh为结尾,这样我们统一放到/sh目录下保存起来
mkdir /sh
cd /sh
vim first.sh
图2
这就是将linux命令放到一个文件中顺序执行,我们来看一下他的执行结果
图3
看一下是不是显示了当前的目录,并且显示了这个目录下的以vm开头的文件有哪些。
通过上述例子我们实现了批量处理的自动化过程
当然了这个其实也算不上一个完整的脚本,我们让他执行的过程中输出一些信息,以方便我们判断
图4
这才是一个合格的shell脚本,有标示,有注释
#!/bin/bash 主要是为了声明,我一下所写的均为bash语言
第二行为注释行,当写一个比较大的脚本时,如果没有一个好的注释,那么也就也就没有人都能够看懂其中的意思了
下面的echo ""中是会输出的信息
我们来看一下他的执行结果
图4
从上图可以看出一个完整的输出是多么的重要,当然了,之后的脚本输出全部为中文
第一个脚本就编辑到这里
接下来我们介绍几种执行叫脚本的方式
第一种使用绝对路径执行
第二种使用相对路径执行,如./的方式
第三种使用 sh命令来执行 格式 sh 脚本名 不需要执行权限
第四种使用 . 脚本名称的方式执行 不需要执行权限
第五种使用 source 脚本名称 不需要执行权限
重定向与管道符操作
由于,shell脚本的特殊性,其大部分操作都是在后台,不需要用户参与,因此需要学会提取,过滤其中执行的信息十分重要
我们介绍两个操作重定向和管道符号
重定向分为三种如下表
? 交互式硬件设备
n 标准输入:从该设备接收用户输入的数据
n 标准输出:通过该设备向用户输出数据
n 标准错误:通过该设备报告执行出错信息
类型 |
设备文件 |
文件编号 |
默认设备 |
标准输入 |
/dev/stdin |
0 |
键盘 |
标准输出 |
/dev/stdout |
1 |
显示器 |
标准错误输出 |
/dev/stderr |
2 |
显示器 |
上表就是三种输入输出的标准,这里我们将的是重定向,也就是说输入输出不在是标准的输入输出,而是通过重定向改变输入输出的方向
执行一个显示命令ls或者cat命令正常的执行完成之后会显示在屏幕上,通过重定向我们将他们输出在文本中不在正常输出到屏幕上(现在我是使用的xshell软件远程连接的)
下面实际中操作符
类型 |
操作符 |
用途 |
重定向输入 |
< |
从指定的文件读取数据,而不是从键盘输入 |
重定向输出 |
> |
将输出结果保存到指定的文件(覆盖原有内容) |
>> |
将输出结果追加到指定的文件 |
|
标准错误输出 |
2> |
将错误信息保存到指定的文件(覆盖原有内容) |
2>> |
将错误信息追加到指定的文件中 |
|
混合输出 |
&> |
将标准输出、标准错误的内容保存到同一个文件中 |
接下来我们演示一下上表的叙述是否正确
图5
上图也能看出来他的作用,没有重定向,结果输出在正常设备上显示器上,重定向输出之后,不在输出在显示器上而是输出在文一个文本中,我们执行一些脚本,我们怎么知道执行没有执行我们就是可以把这些信息保存到一个文本中,正常执行的放一个,错我执行的放一个,这样方便我们去读取,接下来我们看一下重定向输入,这个根输出一样是改遍输入的方向
我们给一个用户设置密码,不在使用传统的方式键盘输入,而是通过一个文本中将密码设置成功
随便在/sh/建立一个文件名字为pass
里面输入123456
我们给root设置密码
图6
这就是重定向输入,一般不常用,但是我们也需要知道他的作用
接下来我们看一下标准错误输出,这个非常好理解,只有执行错误的时候,才会输出到文本中
我们看一个例子
图7
我们可以看见执行tar命令时会有一个异常输出被保存到了一个文件中,我们重上图也可以看见被保存的呢内容
>> 和 2>> 与 > 的功能其实是一样的只不过一个>是覆盖 两个>>是追加,这里不在进行演示
我们看一下混合输出
我们可以通过脚本自动编译apache
在/sh目录下vim httpd_install.sh脚本
图8
我们可以看见 ./configure的信息输入到了一个文本,make 的过程放入了一个文本 make install 的过程放如了一个文本
我们赋予x权限执行一下
应该是整个执行的过程都没有输出任何信息才可以
图9
这是整个执行的过程,没有输出任何信息
我们看一下其中的一个文件看一下保存的信息,具体信息这里就不显示了,直接看一下他的安装结果吧
图10
安装完成了,通过上面的脚本安装apache就可以看出重定向输出的好处。自动执行一些任务如果没有输出你讲无从查起
重定向就说到这里,接下来我们看一下管道符号
我们之前就已经接触过管道符号,它的作用就是将前面的执行结果作为后面的处理对象
我们看一个例子
图11
上图就是用到了管道符号进行过滤
如果没有管道符号,cat命令会将整个passwd文件显示出来,这是我只需要包含root的行这是就可以使用管道符号,将前面执行的结果过滤一下
我们还可以使用awk进行过滤 与gerp不同的是它是以段来提取信息的
我们还是以上图为例,他是显示了一整行,而我现在只需要root用户和root用户登录的shell
通过图11可以看到root用户名在第一字段而登录shell是在第七字段中间使用:分割我们可以使用awk命令进行过滤
图12
把grep过滤的信息在进行删选,只需要第一和第七个字段
-F 指定以什么进行分割后面的是
awk 选项 参数 参数的格式 ‘{$*}‘ *=1-9
我们再来看一个例子
过滤磁盘根分区的使用率
图13
没有进行过滤之前
图14
过滤之后
"/$" 是以/结尾的行 也就是过滤的关键字
这个知识点就讲到这里,接下来我们来探讨脚本中作重要的东西变量
变量的定义是:可以存放一个可变的值的空间
可以通过不同的环境进行改变就是一个可以变的值
常见的shell变量有自定义变量、环境变量、位置变量、预定义变量
1、自定义变量
自定义变量是用户根据自己的环境自己定义的变量
Bash中比较简单的变量,不用进行提前声明,而是直接指定变量名称并赋给初始值
定义变量的基本格式为变量名=变量值等号两遍不允许出现空格,变量名称只能以字母和下划线开头名称中不能包含+、- * 、 / . , 、 ? % * …… 等一些特殊字符
来进行定义一个变量名字为product值为Benet5.0
图15
可以直接在命令行定义,以上就是定义一个变量并赋予值,通过echo进行输出变量 $是引用变量的特殊字符(必须使用$符号)
echo和调用的变量之间必须要有空格
当需要一起调用两组变量时
图16
直接使用echo 后面跟$调用的变量 如果有多个则空格隔开
当变量名和后面的字符容易混淆的时候应该使用{}将变量括起来
图17
变量值还有一些其他的特殊操作
1)双引号(")
当=好右边赋值出现空格的时候,不需要使用双引号将其扩起,其他情况下通常可以省略
图18
在双引号的范围内还可以引用其他的变量,从而能够将现有的变量赋值给新的变量
图19
以上就是双引号的作用
2单引号(‘)
当要赋值的内容包括"$"、"\"等具有其他含义的特殊字符时应使用单引号将其括起来在单引号范围内将无法引用其他的值,任何字符均作为普通字符看待,但赋值的内容包含单引号时需要使用\’符号进行转义以免冲突
图20
3)反撇号(`)
在键盘esc的下边的按键。
反撇号主要使用于命令替换,允许将某个命令的屏幕输出结果赋值给变量。反撇号括起来的范围内必须是可执行的命令。否则将会出现错误
我们来看一个例子
在命令行中查找rp程序的所在位置并列出详细的信息
图21
可以看出反撇号的输出结果作为了ls命令处理的对象
需要注意的是使用反撇号难以在一条命令中实现嵌套命令的操作,这是可以$()来替代反撇号,已解决前台的问题
图22
这条命令就是查询useradd命令程序软件包所安装的配置文件路径的位置
嵌套执行的过程就是从里到外先后执行,
4)read命令
除了上面的赋值之外还可以使用read命令进行赋值,read命令用来提示用户输入信息,从而实现简单的交互式过程(其实我们所输入的命令就是一种交互式的过程)
执行时需要从标准输入设备键盘读取一行,并以空格为分隔符
比如我同时定义两个变量操作如下所示
图23
如果有多个则按照上图的格式进行书写
为了交互式更加的形象,提高易用性,加上 -p选项来设置提示信息
图24
以上就是read的操作非常简单
我们以上的操作只是在当前的bash环境下生效,到了其他控制台或者是其他shel就不能生效了
我们进入当前shell的子shell
图25
进入子shell之后在局部定义的变量就不会生效了。上图输出变量却没有任何输出,只能说明一点,当前bash内不存在输出的变量
我们可以通过set查看当前的所有变量
我们可以通过env查看全局变量
exit退出当前的bash回到父bash
我们可以将一个局部变量改变为全局变量
图26
上图就是将一个局部变量改为了全局变量
也可以之间定义一个全局变量并赋值
图27
需要注意的是变量的名是严格区分大小写的
数值变量的运算
shell脚本的数值运算多用于脚本程序的过程控制(如循环次数,使用量比较等)
在shell环境中,只能进行比较简单的整数运算
运算符与变量之间必须有一个空各位,整数的运算主要是通过内部命令expr 命令尽心运算
格式 变量1 运算符变量2
其中 变量1 、变量2 ……对应的需要计算的数值变量(需要$符号调用)常用的几种运算符如下所示
? 加法运算:+
? 减法运算: -
? 乘法运算: \*
? 除法运算: /
? 求模(取余)运算: %
我们使用这几种运算符进行变量的运算
图28
前几个都好说我们小学就学过了
取余数 就是 15 / 21 除不开则 =除数本身
如果X / Y 则结果会如何
图29
X / Y 能进行运算,并且会有余数 这就是取于
PS:不能出现小数
若要将运算结果赋值给其他变量可以这么做
图30
这就是将云算的结果赋值给其他变量
这也是算一个值的3次方的方法
自定义变量就讲到这里
我们接下来研究特殊shell变量
1、环境变量:
环境变量是指系统本省运行需要由linux系统提前创建好的一类变量,主要用于用户的工作环境,包括用户的宿主目录,命令的查找路径,用户的当前目录,登录的终端等环境变量的值有操作系统本身自己维护,随着用户的状态改变而改变
图31
这只是一小部分,是通过env调取的当前环境变量
环境变量的配置文件在/etc/profile(全局)
用户宿主目录/home/zhangsan/.bash_profile(局部)
上面还有好多没有我这里了就不截图了,
我这里介绍几个常用的又比较重要的变量
PWD
图32
我们使用的pwd命令就是调用了这个变量才能进行输出
PATH
图32
定义命令的默认搜索路径,前一章我们讲的mysql可执行程序优化的时候我们是直接将程序路径写到了这个变量中才可以再任何目录下进行输入
USER
图33
SHELL
图34
HOME
图35
我们可以将我们所写的脚本放到$PATH的默认搜索路径中去
图36
将/sh目录写入到PATH的环境变量中,但是还没有永久生效
图37
刷新一下这个配置文件就可以永久生效了
之后/sh下的可执行程序可以在任何目录下直接执行执行不许要任何命令去执行
图38
我现在在/usr/local/httpd这个目录下 但是我没有在/sh目录下就可以执行了
这就是环境变量的好处
这里的文件内容都是一些循环语句,这些内容我们在下一章进行讨论
每个用户还有自己的环境变量都在自己的宿主目录中
好了环境变量就是这些,接下来我们看一下位置变量
2、位置变量
为了使用shell脚本程序是方便通过明林行为为程序提供参数Bash引用了位置变量的概念,当执行命令行操作时第一个字段表示命令字或程序名,其余的字符串参数按照从左到右的顺序依次给位置变量赋值
位置变量也成为位置参数,使用$1 $2 $3 …$9表示
以ls -lh /boot/
其中除了 ls 之外的都是位置参数
-lh是一个位置参数使用$1表示依次往后排
$0属于预定义变量而不是位置变量
我们编写一个加法运算的脚本来说明位置变量
vim adder2num.sh
图39
图40
第一次执行错误,是因为没有为变量赋值
第二次依次为$1 $2 输入了对应的值,最后输出结果
这就是位置变量的作用,之后会进行实际的脚本进行系统的演示
3、预定义变量
? $#:命令行中位置变量的个数(程序执行了几个位置参数)
? $*:所有位置变量的内容(具体的内容 比如/boot就是一个具体的内容)
? $?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
判断是否出现错误正常为0异常错误为非0 取值在1-127之间
? $0:当前执行的进程/程序名(就是当前执行的命令或程序的名字)
我们通过一个例子来解释
vim mybak.sh 编译一个使用打包命令打包多个目录或文件
新建的压缩包的内容嵌入秒刻(从1970年至今进过的秒数)
图41
$*代表具体的备份内容这里也可以说是位置参数
接下来我们看一下执行的结果
图42
程序名后面的都是位置参数也就是要备份的目标
图43
上图为执行的结果,可以结合脚本的内容进行分析
常用的几种变量就讲完了
脚本应用思路
1. 确定命令操作(设计并执行任务)
2. 编写Shell脚本(组织任务过程)
3. 设置计划任务(控制时间,调用任务脚本)
接下来就是简单脚本的编写实战了
今天我们进行6个实验对今天的内容做一个总结
1、实现管理员在登录系统时显示如下信息
1)当前运行的进程数量
2)当前系统的登录用户的数量
3)当前使用的磁盘根分区的使用情况
我们编写welccome.sh
图44
上图就是一个简单的统计脚本一个简单的自定义脚本
图45
我们赋予执行的权限,并且使用sh -x 对这个脚本进行语法检测,如果出现异常根据提示进行更改就可以了
图46
这是检测输出的信息,没有任何问题
图47
直接执行就可以了
下面我们在/root/bash_profile文件中添加一行
图48
使用exit退出当前用户,在登录就会发现变化
图49
第一个脚本就编写完成了
ps:在工作中脚本的内容不应该出现中文
2、编写脚本实现系统服务启动 停止 当前状态的脚本
我们编写service.sh脚本
图50
我们启动服务一般都在这个路径下启动服务$1位位置变量
停止 stop 启动 start 重启restart 修改对应的位置即可
图51
添加执行权限,执行
为位置变量赋值即可
3、写运行状况监控脚本/sh/monitor.sh,用于记录CPU负载、内存和交换空间、磁盘空间、最近的用户登录情况等信息,以及当时的时间信息。
图52
注意书写格式,这些都是一些简单的脚本
uptime 查看当前CPU的负载
last 查看最近系统的登录情况
图53
赋予执行的权限,并进行测试
图54
执行脚本,并查看记录的信息
cpu的三组数字分别为
0.00 ,0.00 ,0.00
1分钟 5分钟 15分钟
接下来编辑计划任务进行定期执行
crontab -e
要确保crond服务时启动状态
图55
使用之前编辑的脚本进行查看
图56
一个小时执行一次
4、过滤出本机echo网卡的MAC地址,并赋值给hwaddr
编辑脚本hwaddr.sh
图57
就是一条命令赋值给了Hwaddr 同时使用echo 输出了这个变量
图58
赋予执行权限并检查
图59
执行出现结果
5、编写脚本计算当前的内存使用半分比
这个脚本其实与上一个脚本类似
vim memory.sh
图60
为什么内存需要用已使用的\* 100 由于整数运算不支持小数,而使用百分率比小于1,因此将分子\* 100 之后在计算结果
图61
进行赋予权限并检测
图62
已经完成了对内存当前使用的百分比做计算,也需要写入计划任务每隔10分钟进行报告
6、计算3 4 的平方和
这个就是对整数进行运算
vim pingfang.sh
图63
让变量先进行运算,之后将变量输出
图64
赋予执行权限,并进行检查,之后赋予位之变量参数进行运算
shell脚本的简单应用就到这里,下一章我们进行if循环语句