一:概述
系统管理员在管理主机时需要手动处理所有的工作,Shell脚本就可以让系统自动工作,Shell脚本不需要编译,可以直接执行,功能非常强大,可以帮助我们自动处理很多的工作,简化日常化管理。
二:初步了解Shell脚本
在Linux的内部,很多的服务都是基于以Shell脚本(Shell Script)的形式提供的。这个Shell脚本字面上理解就是针对Shell编写的一种脚本,其实就相当于一个程序。这个程序是用Shell的语法和命令编写的,可以帮助我们更好的管理主机。Shell脚本擅长处理纯文本类型的数据,Linux系统中的大部分配置文件和启动文件都是纯文本类型文件,所以Shell脚本在Linux中具有举足轻重的作用。
三:Shell脚本初识演示
在编译Shell脚本时,建议使用Vim,因为Vim可以帮助我们自动检查语法。下面以最简单的Shell脚本输出”Hello World“演示如下图所示:
步骤: 首先在终端输入vim hello.sh建立一个hello.sh的脚本文件,三行内容是脚本中的内容:
这个脚本文件最好保存在用户的家目录中,比如/home/chase/桌面.正确的输入这三行内容之后,保存文件并且退出vim,回到终端之后指定bash hello.sh就可以看到输出的Hello World了。
上面脚本里面写的三行内容代表含义如下所示:
- 第一行#!/bin/bash表示声明这个脚本使用的Shell是bash。这一行内容必须要书写,而且需要放到整个脚本文件的开头。必须以#!的固定格式输入,这一行称shebang,
- 第二行以#开头,这是整个文件的注释内容,不会被执行。注释内容主要是用来说明这个Shell脚本的内容和功能等信息。
- 第三行内容就是整个脚本的程序内容。echo可以输出引号里面的内容。
bash是执行脚本文件的其中一种方式,
Shell脚本的特征:
解释性语言:解释器解释并执行脚本,不需要编译,可以直接运行。(脚本文件第一行定义的就是解释器)
批处理能力:可以在Shell脚本中编写一系列的命令并且执行。
用作编程语言:Shell脚本具有自动义变量和数组之类的编程语言功能,可以高效的描述处理过程。
四:脚本第一行写的解释器
任何一门语言只要提供了解释器,就可以进行脚本编程。常见的解释型语言都可以用作脚本编程,比如Perl、Python、PHP等等。常见的几种编译器如下表所示:
解释器 | 说明 |
#!/bin/sh | Bourne Shell,是UNIX最初使用的Shell |
#!/bin/bash | Bash (Bourne Again Shell),是Bourne Shell的扩展 |
#!/usr/bin/perl | Perl语言的解释器 |
#!/usr/bin/python | Python语言的解释器 |
注意:因为系统会从上打下的、从左到右地分析和执行脚本里面的内容。在执行脚本的时候,内核会根据#!后的解释器确定执行脚本内容的程序。所以解释器必须写在脚本内容的第一行。
五:运行Shell脚本的方式
Shell脚本的执行方法有多种,常用的有四种,其中也包括bash这种执行方式,如下表所示:
执行方式 | 说明 |
bash shellscript.sh | bash命令以解释器的形式在子Shell启动并执行脚本,脚本文件不需要执行(x)权限 |
./shellscript.sh | 在当前的Shell(父Shell)中开启子Shell环境,脚本文件需要执行权限 |
.shellscript.sh | 在当前Shell环境中执行脚本,脚本文件不需要执行权限 |
source shellscript.sh | 在当前Shell环境中执行脚本,脚本文件不需要执行权限 |
注意:在执行脚本文件之前,还需要实现设置好脚本文件的执行权限才行。使用.source的方式是在当前的Shell环境中执行脚本文件的,bash和./这两种方式是在当前Shell中开启一个子Shell环境、是在子Shell环境中执行脚本文件的。
下面对于上面的表格实际操作演示一下,截图如下:
可以使用各种文本编辑器来编写Shell脚本,比如之前使用的vi和vim。下面以一个测试脚本,可以输出三行内容,
第二种方式,直接使用./的方式执行会提示你的权限不够。这样就需要赋予执行权限了,用chmod这个命令给test.sh脚本文件执行(x)权限,然后再用这种方式执行脚本文件就可以了,如下图所示:
后面两种执行方式调用子进程时可以直接在当前进程时可以直接在当前进程中运行并且把结果显示在当前进程中,使用.test.sh方式执行脚本文件时,注意,(半角句号)和脚本文件之间有一个空格,
注意:创建文件时,最好使用.sh作为脚本文件的后缀名,一般情况下以.sh结尾的文件就表示Shell脚本文件。
六:执行脚本文件时的指定选项
使用bash命令读取和执行脚本时,就可以指定选项。这些选项可以有效地设置加载或调式脚本文件,,如下表所示:
选项 | 说明 |
-n | 检查脚本文件中地语法错误 |
-e | 脚本内容出现错误时,返回错误并且停止运行脚本文件 |
-x | Shell脚本中的内容会逐步显示在命令行,错误也会显示 |
如果在脚本文件中输入错误的命令,执行后会提示以下截图的错误内容:
第4行的dssdd出现了一个错误的命令。
上面是不带任何选项的脚本文件的情况,可以看到执行错误的命令dssdd时会出现“未找到命令的提示信息”。脚本文件里的pwd命令显示当前的工作目录,这个命令也可以正常显示/home/,脚本会一直执行到命令结束。
执行脚本文件时指定-e选项,如下图所示:
执行脚本文件执行到错误命令dssdd时会返回错误的的信息然后停止运行脚本文件。
如果你想同步显示脚本内容和执行结果,可以指定-x选项。这样可以看到具体的出错位置和执行结果,脚本中的内容会以+的形式显示出来,如下图所示:
七:Shell脚本中的特殊变量和参数
Shell脚本提供了一些重要的特殊变量来存储参数信息,他在接收命令行参数时,是根据参数的位置顺序来接收的。下面是一些可以在脚本文件中使用的有特殊变量,如下表所示:
特殊变量 | 说明 |
$0 | 当前的Shell脚本文件名 |
$n | 获取当前执行Shell脚本的第n个参数 |
$# | 获取当前执行Shell脚本接收脚本参数的数量 |
$@ | 将每个变量用双引号括起来没每个变量都是独立的 |
$* | 将所有的非$0参数存储为单个字符串 |
$? | 退出状态。0表示成功,非0表示失败 |
$$ | 获取脚本运行的进程的进程号 |
下面写一个脚本文件,来演示这些特殊的变量:
执行这个脚本文件时,在后面指定两个参数,分别为CentOS和Ubuntu。执行结果如下图所示:
第一个参数CentOS对应$1,第二个参数Ubuntu对用$2,$0对用的是脚本文件test2.sh,脚本运行的进程号对应5368对应的是$$,最后一个输出所有参数对应的是$*。
$?代表的是退出状态,0表示成功.