跟老韩学Linux自动化运维(基础篇)
上QQ阅读APP看书,第一时间看更新

Shell是Linux操作系统指令集的概称,是属于操作系统层面的、基于指令集的人机交互界面的脚本级程序运行环境。

Shell是一种操作系统的应用级脚本。Shell脚本提供了一个人机交互界面,用户通过该界面访问可操作系统内核的服务。

1.初识Shell脚本

计算机只能理解由0和1组成的二进制语言。

早期计算机通过二进制语言来执行指令。二进制语言对人类来说难以理解,读、写都很不友好。后来,操作系统里提供了一种叫作Shell的特殊程序,Shell接收英文格式(大多数情况下是英文)指令,如果指令有效,就会被传递给内核,并执行一系列操作。

Shell是用户和Linux内核沟通的“桥梁”,用户的大部分工作是通过Shell完成的。Shell既是一种指令语言,又是一种脚本设计语言。作为指令语言,它交互式地解释和执行用户输入的指令;作为脚本设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

Shell脚本不是Linux内核的一部分,但它调用了系统核心的大部分功能来执行脚本、建立文件,并以并行的方式协调各个脚本的运行。因此,对用户来说,Shell脚本是重要的实用脚本,深入了解和熟练掌握Shell脚本的特性及其使用方法,是用好Linux的关键。实际上,Shell可被看作一个提供给用户用来交互的软件,它可以通过标准输入设备(通常是键盘)或者文件读取指令,并且解释执行用户的指令。

用户与Shell交互的过程如图1-1所示。

图1-1 用户与Shell交互的过程

Shell通过系统调用来执行脚本,如创建文件等。Linux中包含各种不同版本的Shell,查看当前操作系统支持哪些Shell类型,代码如下。

[root@laohan_httpd_server ~]# cat /etc/Shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/bash

查看当前操作系统默认使用的Shell类型,代码如下。

1 [root@laohan_httpd_server ~]# echo $SHELL
2 /bin/bash
3 [root@laohan_httpd_server ~]#

从上述代码第2行中可以看到,当前操作系统默认使用的Shell类型是Bash程序。

2.Shell脚本执行方式

Shell脚本有如下两种执行方式。

(1)交互式(Interactive)。Shell解释器执行用户输入的指令,用户输入一条指令,Shell解释器执行一条。

[root@laohan-Shell-1 ~]# date
2019年12月 06日星期五 15:27:39 CST
[root@laohan-Shell-1 ~]# whoami
root
[root@laohan-Shell-1 ~]# echo "我的名字是老韩" 
我的名字是老韩

上述代码中,用户输入的指令会逐条执行,结果会输出到当前终端(显示器)。

(2)批处理。用户可事先写一个Shell脚本(Script)文件,脚本文件中有很多条指令,Shell解释器可以一次性把这些指令执行完毕,并将指令运行状态返回给用户。

1 [root@laohan-Shell-1 chapter-1]# cat multi-command.sh
2 uname -n
3 current_date=$(date +%F-%T)
4 echo $current_date
5 whoami
6 echo
7 echo "我的名字是老韩"
8 echo $?

上述代码第2~8行会依次执行,输出结果如下。

[root@laohan-Shell-1 chapter-1]# bash multi-command.sh
laohan-Shell-1
2019-12-06-15:29:43
root

我的名字是老韩
0

3.Shell脚本的局限性

Shell只定义了一种非常简单的编程语言,如果脚本复杂度较大,或者要操作的数据结构比较复杂,建议使用Python等其他编程语言解决对应的问题。

建议根据不同的使用场景有选择性地使用不同的编程语言。因为Shell在处理复杂的业务逻辑(如前后端数据交互)方面的能力很弱,此时建议使用Python脚本进行处理,Shell脚本的局限性如下。

Shell脚本中函数只能返回字符串,无法返回数组。

Shell脚本不支持面向对象,无法实现一些优雅的设计模式。

Shell脚本是解释型语言,边解释边执行。如果脚本包含错误(如调用了不存在的函数),只要没调用函数代码库,系统就不会报错。