Linux Shell

17 Mar 2025 | 6 分钟阅读

Shell 可以被定义为 Linux/GNU 或 Unix 等操作系统中的命令解释器。它是一个运行其他程序的程序。Shell 作为用户与 Unix/GNU Linux 系统的接口,为计算机的每个用户提供便利。因此,用户可以使用少量输入数据来执行各种工具/实用程序或命令。

Shell 完成运行程序后,会将结果通过屏幕发送给用户,屏幕是常见的输出设备。这就是它被称为“命令解释器”的原因。

Shell 不仅仅是一个命令解释器。此外,Shell 也是一种编程语言,具有完整的 编程语言 结构,例如函数、变量、循环、条件执行等等。

因此,GNU/Unix Linux Shell 比 Windows Shell 更强大。

广义上,Shell 分为两大类,如下所述:

Linux Shell

图形 Shell

这些 Shell 通过允许进行移动、关闭、调整大小打开窗口以及在窗口之间切换焦点等操作,来指定基于图形用户界面 (GUI) 的程序的操作。Ubuntu OS 或 Windows OS 可以看作是一个很好的例子,它为用户提供了图形用户界面来与程序进行交互。许多用户不需要为所有操作输入任何命令。

命令行 Shell

用户可以通过命令行界面访问各种 Shell。Windows 中的一个名为命令提示符的独特程序,或者 macOS/Linux 中的终端,用于输入人类可理解的命令,如“ls”、“cat”等,然后执行。结果随后在终端上显示给用户。

对于许多初学者来说,在命令行 Shell 上工作很复杂,因为很难记住多个命令。命令行 Shell 非常强大,它允许用户将命令存储在文件中并一起运行。这样,重复性操作就可以轻松自动化。通常,这些文件在 macOS/Linux 系统中称为 Shell 脚本,在 Windows 中称为批处理文件。

有几种类型的 Shell,讨论如下:

Linux Shell

Bash Shell

bash Shell 中,bash 指的是 Bourne Again Shell。它是当今许多 Linux 发行版的默认 Shell。它是一个 sh 兼容的 Shell。它也可以安装在 Windows OS 上。它在 sh 的基础上提供了交互式和编程使用的实用改进,包括:

  • 作业控制
  • 命令行编辑
  • Shell 别名和函数
  • 无限大小的命令历史
  • 基数为 2-64 的整数算术

Csh/Tcsh Shell

Tcsh 是一个升级版的 C Shell。此 Shell 可用作 Shell 脚本命令处理器和交互式登录 Shell。
Tcsh Shell 包含以下特性:

  • 类 C 语法
  • 文件名补全和可编程单词
  • 命令行编辑器
  • 作业控制
  • 拼写检查

Ksh Shell

Ksh 是Korn shell 的缩写。它由David G. Korn 开发和设计。Ksh Shell 是一种高级、强大、完整的编程语言,它也是一种交互式命令语言,就像许多其他 GNU/Unix Linux Shell 一样。C Shell 的用法和语法与 C 编程语言非常相似。

Zsh Shell

Zsh Shell 被开发成具有交互性,并结合了其他 GNU/Unix Linux Shell(如 ksh、tcsh 和 bash)的多种方面。此外,POSIX Shell 标准规范是基于 Korn Shell 的。
此外,它像其他可用的 Shell 一样,也是一种强大的脚本语言。它的一些独特功能列于下:

  • 启动文件
  • 文件名生成
  • 登录/注销监控
  • 概念索引
  • 闭包注释
  • 变量索引
  • 键索引
  • 函数索引以及我们可以在 man 手册页中找到的更多内容。

所有这些 Shell 都执行类似的任务,但使用不同的命令并提供不同的内置函数。

鱼类

Fish 的意思是“friendly interactive shell”(友好交互式 Shell)。它于 2005 年生产。Fish Shell 被开发成与其他 Shell 一样完全用户友好和交互。它包含一些优秀的特性,如下所述:

  • 基于 Web 的配置
  • Man 页补全
  • 自动建议
  • 支持 term256 终端自动化
  • 完全用干净的脚本编写

Shell 提示符

它被称为命令提示符,由 Shell 发出。当提示符显示时,我们可以键入任何 命令
当我们按下 Enter 键后,Shell 会读取我们的输入。它通过查看我们输入的第一个单词来识别我们想要运行的命令。单词可以定义为不间断的字符集。制表符和空格用于分隔单词。

下面是一个常见的日期命令示例,显示当前的时间和日期:

我们还可以使用 PS1(环境变量)来自定义我们的命令提示符。

Shell 脚本

Shell 脚本的基本概念是命令列表。一个好的 Shell 脚本应包含以 # 符号开头的注释。

Shell 函数和脚本是解释执行的。这意味着它们不会被编译。

还有条件测试,例如值 Y 大于值 Z,循环允许我们处理大量数据,文件用于存储和读取数据,变量用于存储和读取数据,这些脚本可能包含函数。

Shell 通常是交互式的,这意味着它们接收用户的命令作为输入并执行它们。尽管如此,有时我们希望例行运行一组命令,因此,我们必须一直输入命令到终端。

Shell 脚本包含与其他编程语言类似的语法。如果您之前有 C/C++Python 等编程语言的经验,那么开始使用它会非常容易。Shell 脚本结合了以下组件:

函数

  • 控制流: if、else、then、Shell 循环、case 等。
  • Shell 命令: touch、pwd、echo、ls、cd 等。
  • Shell 关键字: break、if、else 等。

Shell 脚本的必要性

编写这些 Shell 脚本有几个原因:

  • 避免自动化和重复性工作
  • 系统管理员使用 Shell 脚本进行许多例行备份
  • 为 Shell 添加新功能
  • 系统监控等

Shell 脚本的优点

  • 语法和命令与直接在命令行中输入的完全相同。因此,程序员不必切换到完全不同的语法。
  • 交互式调试
  • 快速启动
  • 编写 Shell 脚本等要快得多。

Shell 脚本的缺点

  • 单个错误可能会修改命令,这可能会造成危害,因此很容易出现代价高昂的错误。
  • 语言实现和语法中的设计缺陷。
  • 执行速度较慢。
  • 与其他脚本语言不同,它提供的基本数据结构很少。
  • 不适合复杂和大型任务等。

脚本示例

假设我们创建一个 test.sh 脚本。在我们脚本中包含任何其他内容之前,我们需要通知系统脚本已启动。

注意:每个脚本都将有一个 .sh 扩展名。

这可以通过 shebang 结构来实现。

例如

它向系统表明,后面的命令将由 Bourne Shell 运行。它被称为 shebang,因为符号 # 被称为 hash(哈希),符号 ! 被称为 bang(惊叹号)。

要创建包含这些命令的脚本,我们将 shebang 结构放在第一行,然后添加任何命令。

Shell 中的注释

我们可以在脚本中包含如下注释:

使脚本可执行并保存上述内容。

现在,Shell 脚本已准备好运行。

执行后,我们将获得如下结果:

注意:要执行当前目录中的程序,我们可以使用 ./program_name。

扩展 Shell 脚本

Shell 脚本包含一些必需的结构,这些结构定义了 Shell 平台何时执行以及执行什么。大多数脚本比上述脚本更复杂。

毕竟,Shell 是一种真正的编程语言,它拥有完整的控制结构、变量等。尽管如此,无论脚本有多复杂,它仍然只是按顺序执行的命令列表。

以下脚本使用 read 命令通过键盘获取输入,并将其赋值给变量 PERSON,最后将其打印到 STDOUT。


下一主题Linux 含义