首页 > 编程笔记

Shell脚本编程详解

通过前面内容的学习,相信读者已经掌握了 Linux 系统和命令行的基础知识。从本节开始,我将带领读者学习关于 Shell 脚本编程的知识,读者在编写脚本之前必须了解在本章中介绍的基础知识。

Shell 脚本包括命令、变量设置、循环、控制、判断以及逻辑运算等。脚本在运行时需要使用相应的解释器以翻译脚本中存放的信息,从而最终被成功地执行。脚本的编写格式不同即需要使用的解释器也不同,例如编写的 Shell 脚本代码,需要使用 Bash 程序告诉系统应该如何执行这个 Shell 脚本。

常见的脚本有 Shell 脚本、Java 脚本、PHP 脚本、Python 脚本等,其中 Shell 脚本最简单,接下来就主要介绍 Shell 脚本。

Shell脚本格式

每个脚本都遵循一定的规则,Shell 脚本也一样。Shell 脚本文件的格式如下:

#!/bin/bash
# Copyright (c) http://www.weixueyuan.net/linux/
#
#Data:2020-08-26
#Version:0.1

echo "Hello,World!"
exit 0

其中,各行的含义为:
上面展示的脚本文件,是一个完整的脚本应该具有的基本框架。第一行“#!”的作用是指定该脚本程序的命令解释器,即 /bin/Bash。脚本在执行后,系统内核读取“#!”后面的路径查找解释器,最终使用该解释器翻译脚本代码并运行。脚本文件中“#”后面的部分为注释,在脚本程序执行时,该部分会被忽略,这些注释为代码的编写与阅读提供辅助信息。接下来就是脚本的代码部分,这些代码默认会按顺序依次被执行,但通过控制语句控制执行顺序时除外。

创建Shell脚本

Shell 脚本文件是存放各种命令组合的一个简单的文本文件,当需要运行这些命令时,只需要运行这个文本文件就可以了。

创建脚本文件的步骤如下:
1) 使用 touch 命令创建一个空的文件夹,命名为 hello.sh。在终端页面输入命令如下:

[root@bogon ~]# touch hello.sh


2) hello.sh 文件创建完成之后,需要使用 vim 编辑器打开该文件,输入命令如下:

[root@bogon ~]# vim hello.sh

进入 vim 编辑器之后,输入 i 命令,切换到插入模式进行编辑,如图 1 所示。


图 1 编辑 hello.sh

3) 在创建 Shell 脚本文件时,注意在上一小节中提到的脚本格式,必须在文件的第一行指定要使用的 Shell,格式为:

#!/bin/bash

在通常的 Shell 脚本文件中,“#”用作注释行,Shell 不会处理 Shell 脚本中的注释行。但是 Shell 脚本文件的第一行特殊,“#”后面的“!”会告诉 Shell 需要使用哪个 Shell 来运行脚本。

4) 在指定了 Shell 之后,就可以在文件的每一行中输入命令,然后按 Enter 键。之前提到过注释可使用“#”添加。输入命令如图 2 所示。


图 2 写入 Shell 脚本内容

5) 脚本内容输入完成之后,按键盘的 Esc 键退出插入模式;输入“:wq”命令,保存并退出,名为 hello.sh 的脚本文件创建完成。

注意,根据需要,可以使用分号将两个命令放在一行上,但在 Shell 脚本中,可以在独立的行中书写命令。Shell 会按根据命令在文件中出现的顺序进行处理。另外需要注意另有一行也以“#”开头,并添加了一个注释。Shell 不会解释以“#”开头的行(除了以“#!”开头的第一行)。注释用来说明脚本主要做了什么,便于读者理解。

Shell脚本运行方式

脚本在编写完成之后,需要运行并实现脚本程序功能。脚本的执行方式有很多种,但各种方式运行的效果也会不同。常见的运行脚本的方式有以下几种:

以 sh(Bash)进程来执行脚本文件(用户不必拥有对脚本文件的权限),可以在子进程中执行。在终端页面中输入命令如下:

[root@bogon ~]# sh hello.sh
Hello,World!


使用 sh 进程来执行脚本文件时通常有以下选项:
1) sh -x:实现 Shell 脚本逐条语句的跟踪,如下所示:

[root@bogon ~]# sh -x hello.sh
+ echo 'Hello,World!'
Hello,World!
+ exit 0

加号后的数据代表命令串。


2) sh -n:不执行脚本,仅进行语法的检查,如下所示:

[root@bogon ~]# sh -n hello.sh
[root@bogon ~]#


3) sh -v:执行脚本前,先将脚本的内容输出到屏幕上,如下所示:

[root@bogon ~]# sh -v hello.sh
#!/bin/bash
# Copyright (c) http://www.weixueyuan.net/linux/
#
#Data:2020-08-26
#Version:0.1

echo "Hello,World!"
Hello,World!
exit 0


4) 通过绝对或相对路径来执行脚本文件,用户必须拥有对脚本文件的权限。

Linux 系统中的一切都是文件。后缀名“.sh”表示该文件是一个脚本文件,但并不代表该文件是可以被用户执行的。文件是否可以被执行取决于用户是否拥有对该文件的执行权限,同时是在子进程中执行。

赋予权限,执行脚本的过程如下所示:

[root@bogon ~]# ll hello.sh
-rw-r--r--. 1 root root 121 Aug 26 04:59 hello.sh
[root@bogon ~]# ./hello.sh
bash: ./hello.sh: Permission denied
[root@bogon ~]# chmod a+x hello.sh
[root@bogon ~]# ll hello.sh
-rwxr-xr-x. 1 root root 121 Aug 26 04:59 hello.sh
[root@bogon ~]# ./hello.sh
Hello,World!
[root@bogon ~]#


5) 将脚本文件所处的目录添加到 PATH 环境变量中,通过输入脚本文件名来直接运行,该种执行方式也要求用户必须拥有对脚本文件的权限,在子进程中进行执行操作。

脚本所在目录添加到 PATH 变量中的过程如下所示。

[root@bogon ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin
[root@bogon ~]# pwd
/root
[root@bogon ~]# PATH=${PATH}:/root
[root@bogon ~]# hello.sh
Hello,World!
[root@bogon ~]#


6) 通过 source 命令或小数点“.”来执行脚本文件,该方式在父进程中执行。使用命令如下:

[root@bogon ~]# source hello.sh

[root@bogon ~]# . hello.sh

注意“.”与脚本之间有空格。

优秀文章