第十章、Shell 编程

1. Shell 简介

Shell 是 Linux/UNIX 操作系统中用于用户与内核(Kernel)交互的接口,既是命令行解释器,也是一种脚本编程语言。它的核心作用是充当用户与操作系统硬件/服务之间的翻译,同时具备自动化任务的能力。

Linux 操作系统的机构

计算器在现代计算机系统中,硬件是最根本的存在。为了能更好的管理硬件,让硬件协同工作,出现了运行与内核态的操作系统软件(如:Windows、Linux、MacOS等)。但操作系统并不提同各种应用程序,处于内核态运行的操作系统只提供一些可以让应用程序调用的接口供应用程序访问硬件。Linux 操作系统结构如下图所示:

Shell 结构

Shell(壳)软件是调用用户管理应用程序,解析用户输入,并能够批量运行用户命令的工具。他允许你讲操作的命令写入文件中,然后批量的运行。

Shell 的种类

  1. sh: 位于 /bin/sh 是早期标准 Shell,较简洁。
  2. bash: 位于 /bin/bash 是 Linux/macOS(10.15及以下) 默认 Shell,兼容 sh,功能丰富。
  3. zsh: 位于 /bin/zsh Linux 需要 sudo apt install zsh 安装,是 macOS(11及以上) 默认 Shell。
  4. powershell:Windows 上最新比较好用的 Shell。

Linux 下 每个用户在登录后都会自定默认使用的 Shell ,他是在创建用户时指定的,见 /etc/passwd 最后一列,如:

root:x:0:0:root:/root:/bin/bash
...
weimingze:x:1000:1000:weimingze:/home/weimingze:/bin/bash

查看你的系统可用的 Shell

Linux 系统可用登录的 Shell 保存在文件 /etc/shells 内部。可以使用 cat /etc/shells 查看所有可用的 Shell。如:

weimingze@mzstudio:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/usr/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/dash

切换 Shell

用户可以在终端内切换到其他的 Shell 对计算机进行操作:

示例:

weimingze@mzstudio:~$ sh  # 进入 sh Shell
$ pwd
/home/weimingze
$ exit  # 退出 sh Shell
weimingze@mzstudio:~$ zsh  # 进入 zsh Shell(需要用 sudo apt install zsh 安装)
mzstudio% pwd
/home/weimingze
mzstudio% exit  # 退出 zsh
weimingze@mzstudio:~$

你会发现 不同的 Shell 命令提示符有所图同,bash 的提示符是 weimingze@mzstudio:~$, sh 的提示符是 $ , zsh 的提示符是 mzstudio%

除了提示符不同外,各种 Shell 的语法也会略有不同。

使用 sh Shell 来查看进行示例

我们先进入 sh, 然后在 sh 内运行 ps -ejH --forest 命令,查看进程树

weimingze@mzstudio:~$ sh  # 进入 sh Shell
$ ps -efH --forest
...
weiming+    3945    2880  0 12:14 ?        00:00:06  \_ /usr/libexec/gnome-terminal-server
weiming+    3953    3945  0 12:14 pts/0    00:00:00  |   \_ bash
weiming+    5500    3953  0 14:24 pts/0    00:00:00  |       \_ sh
weiming+    5585    5500 99 14:24 pts/0    00:00:00  |           \_ ps -efH --forest
weiming+    5510    2880 20 14:24 ?        00:00:03  \_ /usr/bin/nautilus --gapplication-service
$ exit
weimingze@mzstudio:~$

可见,终端默认运行的是 bash 进程,bash 启动了 sh, 最后由 sh 进程启动了 ps 进程。

下面我们来学习 bash 的语法。

练习:

  1. 说出 Shell 三种实现部分。
  2. 在 Linux 系统中,切换到 sh ,然后创建几个文件和文件夹。
  3. 再次切换到 bash ,然后删除上面创建的几个文件和文件夹。
  4. 使用 exit 命令来退出 bash
  5. 再次使用 exit 命令来退出 sh
  6. 再次使用 exit 命令来退出当前终端。