什么是 shell脚本

shell 脚本就是利用 shell 的功能所写的一个程序( program ),这个程序使用纯文本文件,将一些 shell 的语法和命令( 含外部命令 )写在里边,搭配正则表达式,管道命令和数据流重定向等功能,以达到我们所想要的处理目的

简单地说,shell脚本 就像是早期 DOS 时代的批处理文件( .dat ),最简单的功能就是将许多命令集合写在一起,让用户很轻易地就能够用 one touch 的方法去处理复杂的操作( 执行一个shell脚本,就能够一次执行多个命令 ),而且 shell脚本更提供数组,循环,条件与逻辑判断等重要功能,让用户也可以直接用 shell 来编写程序,而不必使用类似 C 等传统程序语言来编写。

shell脚本优点

将人工通过手工操作的命令执行功能操作,转移到脚本中通过脚本程序完成自动化操作

  • 基础配置:系统初始化操作,系统更新,内核调整等
  • 安装程序:自动部署 LNMPLAMPMySql
  • 配置变更:Nginx配置MySql配置Redis配置
  • 业务部署:配合 gitjenkins 等实现自动化持续交付
  • 日常备份:脚本对项目或者软件实现全备份或增量备份等
  • 信息采集:硬件,系统,服务,网络等各种数据的自动采集
  • 日志分析:获取日志,排序,去重,统计,分析
  • 服务扩容:监控服务器信息,脚本程序自动化扩容部署

shell脚本可以完成自动化操作之后,重复性的周期性的工作比手工执行有如下的优势:

  • 减少重复工作,周期性工作
  • 减少故障几率,降低工作量

第一个脚本的编写与执行

如同前边所说的,shell脚本其实就是纯文本文件,我们可以编辑这个文件,然后让这个文件来帮我们一次性执行多个命令,或是利用一些运算与逻辑判断来帮我们完成某些功能。在shell的编写中还需注意下面的事项:

  • 命令是从上而下,从左而右地分析与执行
  • 命令,选项与参数间的多个空格都会被忽略掉
  • 空白行也会被忽略掉,并且 Tab 按键所产生的空白同样视为空格键
  • 如果读取到一个 Enter符号( CR ),就尝试开始执行该行命令
  • 如果一行的内容太多,可以使用 \Enter 来扩展至下一行
  • # 视为注释,任何加在 # 后边的数据会被忽略

编写第一个脚本

在武侠世界中,学武功都要从扫地和蹲马步做起,那么学程序呢,则是由 显示hello world 这段文字开始:

#!/bin/bash
# This program shows "hello world" in your screen
# ...
# ...

echo "hello world"
exit 0

将整个程序分成数段,大致是这样:

1. 第一行 #!/bin/bash 旨在声明这个脚本使用的 shell 名称

由于我们使用的是 bash,因此必须要以 #!/bin/bash 来声明这个文件内使用 bash 的语法,当程序执行时,它能够加载 bash 的相关环境配置文件,并且使用 bash 来使我们下面的命令能够执行。如果没有设置好这一行,那么程序很可能无法执行,因为系统可能无法判断程序需要使用什么 shell 来执行

2. 程序内容的说明

整个脚本当中,除了第一行的 #! 是用来声明 shell 的之外,其它的 # 都是注释用途,一般来说,第二行用来整个程序的基本数据:1. 内容与功能,2. 版本信息,3. 作者联络方式,4. 建文件日期,5. 炉石记录等。这将有助于未来程序的改写与调试。

3. 主要程序部分

将主要的程序写好即可,在这个例子中,就是 echo 那一行

4. 执行结果告知( 定义返回值 )

一个命令的执行成功与否,可以使用 $? 这个变量来观察,那么我们也可以利用 exit 使程序中断并返回一个数值。我们执行完这个脚本后,若接着执行 echo $? 则可以得到 0 的值。利用这个 exit 的功能,我们还可以自定义错误信息,让程序变得更聪明!

执行脚本

假设你编写的文件为 hello.sh ,那么如何执行这个文件?可以使用以下办法:

  • 作为可执行程序 ./hello.sh 文件必须具备 可读 和 可执行 权限
  • 作为解释器参数 sh ./hello.sh 文件只需具备 可读 的权限即可