第十章、Shell 编程
1. Shell 简介
Shell 是 Linux/UNIX 操作系统中用于用户与内核(Kernel)交互的接口,既是命令行解释器,也是一种脚本编程语言。它的核心作用是充当用户与操作系统硬件/服务之间的翻译,同时具备自动化任务的能力。
Linux 操作系统的机构
计算器在现代计算机系统中,硬件是最根本的存在。为了能更好的管理硬件,让硬件协同工作,出现了运行与内核态的操作系统软件(如:Windows、Linux、MacOS等)。但操作系统并不提同各种应用程序,处于内核态运行的操作系统只提供一些可以让应用程序调用的接口供应用程序访问硬件。Linux 操作系统结构如下图所示:

Shell(壳)软件是调用用户管理应用程序,解析用户输入,并能够批量运行用户命令的工具。他允许你讲操作的命令写入文件中,然后批量的运行。
Shell 的种类
sh: 位于/bin/sh是早期标准 Shell,较简洁。bash: 位于/bin/bash是 Linux/macOS(10.15及以下) 默认 Shell,兼容sh,功能丰富。zsh: 位于/bin/zshLinux 需要sudo apt install zsh安装,是 macOS(11及以上) 默认 Shell。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 对计算机进行操作:
- 进入 Shell 需要执行 Shell 命令,如:
/bin/sh。 - 退出 Shell 使用
exit命令。
示例:
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 的语法。
练习:
- 说出 Shell 三种实现部分。
- 在 Linux 系统中,切换到
sh,然后创建几个文件和文件夹。 - 再次切换到
bash,然后删除上面创建的几个文件和文件夹。 - 使用
exit命令来退出bash。 - 再次使用
exit命令来退出sh。 - 再次使用
exit命令来退出当前终端。