什么是 Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 也是 Linux 的命令解释器,用于解释用户对操作系统的操作;Shell 会把用户所执行的命令翻译给 Linux 内核,Linux 内核将执行命令的结果反馈给用户。

比如 ls 命令,Shell 会分析 ls 命令中的选项和参数,然后将该命令交给文件管理器;文件管理器再去和硬盘打交道将返回结果,最终再反馈给用户;如果将 Shell 脚本编写好的话,用户就不用去编写驱动程序,也不用去开发 c 语言,这也就可以去控制内核,控制操作系统去实现自己想做的事情,不用去了解很多操作系统硬件相关的知识。

Shell 也有很多的版本,有 C shell、K shell、TCSH、zsh、ash、bash 等等,而 Linux 默认使用的 Shell 是 bash。

Shell 的分类

目前 Shell 的版本有很多种,如 BourneShellCShellBashkshtcsh 等,版本之间各有特点。

Shell 类别 易学性 可移植性 编辑性 快捷性
Bourne Shell(sh) 容易 较差 较差
Korn Shell(ksh) 较难 较好 较好
Bourne Again (Bash) 较好
POSIX Shell (psh) 较难 较好
C Shell(csh) 较难 较好 较好
TC Shell(tcsh)

简要介绍一下后续文章所用到的的 Shell 版本。

BashShell 也就是 Bourne Again(Bash),是 GNU 计划的重要工具之一,也是 GNU 系统中标准的 Shell。Bash 与 sh 兼容,所以许多早期开发出来的 BourneShell 程序都可以继续在 Bash 中运行。现在使用的 Linux 就使用 Bash 作为用户的基本 Shell。

Bash 于 1988 年发布,并在 1995-1996 年推出 Bash2.0。在这之前,广为使用的版本是 1.14,Bash2.0 增加了许多新的功能,以乃且备更好的兼容性。

Shell 脚本的格式

Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、一键搭建 Web 开发环境、日志分析等,Shell 都非常合适。

使用 Shell 的熟练程度反映了用户对 Linux 的掌握程度,运维工程师、网络管理员、程序员都应该学习 Shell。

尤其是 Linux 运维工程师,Shell 更是必不可少的,是必须掌握的技能,它使得我们能够自动化地管理服务器集群,否则你就得一个一个地登录所有的服务器,对每一台服务器都进行相同的设置,而这些服务器可能有成百上千之多,会浪费大量的时间在重复性的工作上。

Shell也是一种编程语言,它的编译器(解释器)是Shelli这个程序。我们平时所说的Shell.,有时候是指连接用户和内核的这个程序,有时候又是指Shell编程。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

业界所说的 shell 通常都是指 shell 脚本,但要知道,shell 和 shell script 是两个不同的概念。

由于习惯的原因,简洁起见,后续出现的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。

Shell 脚本的格式和现在的编程语言结构很相似,它们都是自上而下执行命令的;在此过程中也会用到变量去临时存储一些数据,这些命令也不一定是顺序执行的,包括了判断和分支、以及循环、定时等功能。

Shell 脚本都有哪些元素构成呢?有 Sha-Bang 、注释、命令组成

Sha-Bang

脚本文件的后缀名一般是 .sh

当该脚本需要传给其他系统去执行,其他系统的默认 Shell 可能不是 bash,那我这个脚本能不能去执行呢?这就引出了 Shell 脚本的文件头格式,示例:

1
2
3
4
5
vim demo.sh

#!/bin/bash

## 你的shell 命令

在以上的文件中可以发现,我在脚本的文件头添加了 #!/bin/bash 这一行命令,这一行命令被叫做 Sha-Bang ,也就意味着告诉执行脚本的系统,使用什么版本的 Shell 去执行该脚本,在本文件中使用 /bin/bash 去执行该脚本。

如果执行该脚本使用的是 bash demo.sh 命令,那么该 Sha-Bang 就会被当作注释;如果使用 ./demo.sh 方法去运行的话,因为不知道该系统默认的 Shell 版本,所以 Sha-Bang 就会被执行,告诉系统使用 /bin/bash 版本的 Shell 去执行该脚本。

注释

在 Shell 脚本文件中,注释是以 # 开头的,# 后面跟的就是该 Shell 脚本的注释。

命令

Shell 也是一种编程语言,虽然没有 C/C++、Java、Python 等强大。但也支持了基本的编程元素,例如:

  • if...else 选择结构、switch...case 开关语句、for、while、until 循环语句等[[Shell中的流程控制|流程控制]]语句。
  • [[Shell 中的变量|变量]]、数组、字符串、注释、加减乘除等常用[[Shell 中的常用运算符|运算]]等概念。
  • 函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。

后续会详细展开以上部分。