shell脚本应用

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循环语句

时间: 2024-10-10 04:57:13

shell脚本应用的相关文章

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

shell脚本交互:expect学习笔记及实例详解

最近项目需求,需要写一些shell脚本交互,管道不够用时,expect可以很好的实现脚本之间交互,搜索资料,发现网上好多文章都是转载的,觉得这篇文章还不错,所以简单修改之后拿过来和大家分享一下~ 1. expect是spawn: 后面加上需要执行的shell命令,比如说spawn sudo touch testfile 1.3 expect: 只有spawn执行的命令结果才会被expect捕捉到,因为spawn会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提示信息,Li

利用SHELL脚本来验证Oracle数据库RMAN备份集的有效性

利用SHELL脚本来验证Oracle数据库RMAN备份集的有效性 作者:赵全文  网名:guestart 我们生产环境的Oracle数据库都做了RMAN备份,是采用了一周的RMAN备份保留策略:除了使用RMAN备份以外,我们还使用了爱数(Eisoo)备份软件来进行备份,可以说是做到了有备无患.可是,如果有一天,Oracle数据库由于主机层面硬件原因或是数据库层面的原因不能对外提供高可用服务的时候,假设数据丢了一大部分,我们只有用RMAN备份来进行恢复,再如果发现,RMAN备份失效了,那就往地缝里

如何在linux Shell脚本里面把一个数组传递到awk内部进行处理

前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分享. 测试环境: [root]# head -1 /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) [root]# awk --version | head -1 GNU Awk 3.1.7 众所周知

利用shell脚本批量修改表

最近公司里因为开发新功能,程序员需要快速在某一个库里的所有表添加字段,于是就用shell脚本简单快速实现批量修改表添加字段 #!/bin/bash export mysql_bin=/usr/local/mysql/bin export database=database export tables=`$mysql_bin/mysql -Bse "use ${database};show tables;"` for i in ${tables}         do          

Shell 脚本模拟 milter 实现黑白名单及关键词过滤

程序执行流程:1. 开始接受邮件.2. 检查发件人是否在黑名单内,如果是拒绝接受;否则继续3. 检查发件人是否在白名单内,如果是接收邮件;否则继续4. 对邮件进行关键字过滤,如果邮件中包含被过滤的关键词信息,则拒绝接收   该邮件;否则,接收该邮件. Usage: sh mailfilter.sh  [-r reject-addr] [-a add-addr][-k keywords]########################################################

Linux Shell脚本攻略(1.12)

1.12 函数和参数 和其他脚本语言一样,Bash同样支持函数,并且可以传递参数. 1.12.1 函数定义和传参 #!/bin/bash function fname() #也可以用fname()代替 { echo $1,$2; #访问参数1和参数2 echo "[email protected]"; #以列表的方式一次性打印所有参数 echo "$*"; #类似于[email protected],但是参数被作为单个实体 return 0; #返回值 } fnam

shell脚本编程学习笔记(1)

在linux上编程,离不开shell,计划好好看看shell编程,并在这里做些笔记以供有相同兴趣的人分享,主要参考<shell脚本学习指南>. 学习shell脚本编程之前,需要了解脚本编程语言和编译型语言的概念. 一般很多中型.大型的程序是用编译型语言写成的,比如C.C++.Java等.这类程序从源代码编译成目标代码,直接通过计算机执行.编译型语言执行效率比较高,大多运作于底层,处理的是字节.整数.浮点数等机器层级的对象,因此实现一个具体的功能,比如"将一个目录里的所有文件复制到另外

用shell脚本实现通用二进制格式mysql 5.5.28 x86_64的安装

用shell脚本实现通用二进制格式mysql 5.5.28 x86_64的安装 首先在网上用gfsoso.com来搜索下载mysql软件包mysql-5.5.28-linux2.6-x86_64.tar.gz,再用 winSCP把mysql上传到服务器上,上传位置可根据个人喜好,我个人一般放在服务器的/usr/local/src目录下. 此处我们是先命令行下实现一次,而后所有操作全部用shell脚本自动实现. 个人环境 centos 6.5 X86-64  所用空闲空间都做成了LVM. 准备工作