笔记日期:2017-11-21@H_502_3@
@H_502_3@
20.1 shell脚本介绍@H_502_3@
Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。@H_502_3@
换一种说法也就是,shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的。@H_502_3@
更明白地来说,shell script就像早期dos年代的.bat,最简单的功能就是将许多指令汇整写一起,让使用者很容易地就能够一个操作执行多个命令,而shell script更是提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。@H_502_3@
@H_502_3@
概念区别:@H_502_3@
shell和shell脚本有什么区别?确切一点说,Shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令型语言,又是一种程序设计语言(就是你所说的shell脚本)。作为命令型语言,它互动式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。@H_502_3@
@H_502_3@
Shell脚本最重要的一点是可以批量去执行Linux中的命令,这样的话就可以实现自动化运维。例如有一个需求,是要让你在凌晨3点的时候进行数据的备份,并且把大于50M的备份文件进行压缩。如果没有shell脚本的情况下,你要完成这个需求就只能凌晨3点爬起来敲命令。使用shell脚本的情况下,我只需要把命令写进脚本文件里,然后再设置一个任务计划,让系统在凌晨3点时自动执行这个脚本文件,还不是美滋滋。所以shell脚本不仅能够提升运维效率,还可以让我们的工作没有那么苦逼。@H_502_3@
@H_502_3@
@H_502_3@
@H_502_3@
20.2 shell脚本结构和执行@H_502_3@
Shell脚本的第一行必须是:#!/bin/bash,"#!" 是一个约定的标记,后面跟着的/bin/bash是告诉系统这个脚本需要使用/bin/bash解释器来执行,即使用哪一种Shell。例如像python脚本就不一样了:#!/usr/bin/env python,因为不同语言所编写的脚本对应的解释器都不一样,但是都需要使用 "#!" 来作为标记。简单来说就是告诉系统这是一个什么语言写的脚本,是python是shell或者是其他的脚本语言所写的,然后系统才能使用相应的解释器去执行这个脚本。不过如果这个shell脚本是在本机执行的话,倒是可以省略掉:#!/bin/bash,因为能够识别本机的命令,但是如果到另一台机器就不一定能够执行了,所以文件的第一行才要写这样的声明。@H_502_3@
Shell脚本的文件名称是以.sh为后缀,用于区分这是一个shell脚本,shell中的注释符是井号“#”,和其他编程语言一样,注释的那一行内容不会被解释器执行,但是要注意区别“#!”和“#”,前者是标记,后者才是注释符。@H_502_3@
@H_502_3@
@H_502_3@
编写第一个shell脚本:@H_502_3@
既然知道shell脚本的基本结构后,我们来编写第一个shell脚本吧:@H_502_3@
vim Hello.sh@H_502_3@
@H_502_3@
@H_502_3@
sh Hello.sh@H_502_3@
chmod a+x Hello.sh; ./Hello.sh@H_502_3@
bash Hello.sh@H_502_3@
@H_502_3@
第二种执行方法是给这个Hello.sh的脚本文件加上了可执行权限,所以可以当做一个二进制文件直接执行:@H_502_3@
@H_403_42@502414B558881FC7674261B72/5034">@H_502_3@@H_502_3@
@H_502_3@
sh和bash实际上是同一个命令,因为sh是bash的软连接文件:@H_502_3@
@H_502_3@
要注意的是,#!/bin/bash写在文件的第一行才是被当做声明,如果写了两行#!/bin/bash,那么第二行就会被当做注释:@H_502_3@
@H_502_3@
将系统命令写在脚本里就会被批量执行:@H_502_3@
@H_502_3@
运行结果:@H_502_3@
@H_502_3@
查看脚本执行过程 bash -x Hello.sh:@H_502_3@
每一个“+”代表执行的命令,后面跟着命令的执行结果。@H_502_3@
@H_502_3@
查看脚本是否语法错误 bash -n Hello.sh:@H_502_3@
没有任何的输出就代表这个脚本没有语法错误。@H_502_3@
例如我把故意把脚本语法写错:@H_502_3@
如图,就会提示语法错误,并且还能告诉你错误出现在文件的第几行。@H_502_3@
但是要注意的是,这只是检查脚本的语法错误,如果你系统命令写错了,是不会被检查到的。@H_502_3@
@H_502_3@
@H_502_3@
@H_502_3@
date是一个与时间日期相关的命令,如果直接使用的话,是显示当前系统的日期时间:@H_502_3@
@H_502_3@
date命令在shell脚本中作用很大,例如我在备份某个文件或者记录某些日志信息的时候,就可以使用这个命令给这些备份文件或日志信息标记一个时间。@H_502_3@
@H_502_3@
关于表示时间符号的解释:@H_502_3@
%Y 4位的年份(Year)@H_502_3@
%y 2位的年份@H_502_3@
%M 表示当前的分钟(Minute)@H_502_3@
%m 表示当前的月份(Month)@H_502_3@
%d 表示当前的日期(Date)@H_502_3@
@H_502_3@
@H_502_3@
把时间戳转换成当前日期:@H_502_3@
@H_502_3@
打印一天后的日期:@H_502_3@
date -d "+1 day" +%F@H_502_3@
@H_502_3@
打印一天前的日期:@H_502_3@
date -d "-1 day" +%F@H_502_3@
@H_502_3@
打印一个月前的日期:@H_502_3@
date -d "-1 month" +%F@H_502_3@
@H_502_3@
打印一分钟前:@H_502_3@
date -d "-1 min"@H_502_3@
@H_502_3@
8. 打印一年前的日期:@H_502_3@
date -d "-1 years" +%F@H_502_3@
@H_502_3@
9. 打印一小时前:@H_502_3@
date -d "-1 hour" +%T@H_502_3@
@H_502_3@
10. 把一个日期转换成时间戳:@H_502_3@
date +%s -d "2017-09-06 06:52:16"@H_502_3@
@H_502_3@
另一个与时间相关的命令:cal,cal命令可以显示日历:@H_502_3@
@H_502_3@
@H_502_3@
@H_502_3@
@H_502_3@
@H_502_3@
20.4 shell脚本中的变量@H_502_3@
shell脚本中的变量和其他编程语言中的变量含义是一样的,都是用来存储一个数据,然后使用变量名就可以进行调用了,shell脚本的语法和其他脚本的语法类似,都不需要使用分号作为语句的结束。@H_502_3@
shell脚本定义变量的规则:@H_502_3@
@H_502_3@
定义一个变量:@H_502_3@
a=10@H_502_3@
name=”lisi”@H_502_3@
@H_502_3@
echo $a@H_502_3@
echo $name@H_502_3@
@H_502_3@
只读变量:@H_502_3@
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。@H_502_3@
下面的例子尝试更改只读变量,结果报错:@H_502_3@
@H_502_3@
运行脚本,结果如下:@H_502_3@
@H_502_3@
@H_502_3@
使用 unset 命令可以删除变量里的数据。语法:@H_502_3@
unset name@H_502_3@
@H_502_3@
示例:@H_502_3@
@H_502_3@
运行结果:@H_502_3@
@H_502_3@
变量类型:@H_502_3@
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。@H_502_3@
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。@H_502_3@
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行@H_502_3@
@H_502_3@
@H_502_3@
@H_502_3@
@H_502_3@