1、基础概念
Shell 程序一般被称为脚本
(Script
),是一组命令的集合,最简单的甚至可以单纯地堆砌命令,就像前文中提到的 Shell 文件。这种脚本最明显的好处是 重复一系列固定命令时 减少敲击键盘的次数。
若需更复杂的逻辑与功能,就要引入一些新的概念如:变量、表达式、流程控制和函数等。此时的它已具完整程序的特征,但亦与前文大量提到的 C 程序有明显差异:C 语言写成的程序是源码,需将.c 和.h 等文件使用编译工具处理成为二进制可执行文件后,才可以执行并看到结果;而 Shell 脚本只需要给脚本文件加上可执行权限。
此差异显示了脚本程序一个显著的特征:解释执行。
Shell 解释脚本的过程就是从一个文件读入字符流,然后进行处理,最后把结果送到一个文件,故交互式 Shell
与执行脚本的 Shell
本质上并无区别。只不过交互式运行的 Shell 的输入文件
是标准输入
,输出文件
是标准输出
。Ctrl+D
组合键会在 标准输入上产生一个 文件尾,因此在交互式 Shell
中可以用这个组合键直接退出 Shell。
Shell 脚本
作为程序
,也可以有注释
。Shell
从任意地方非转义
的#
字符开始,到行末都被认为是注释
,解释的时候当作空白字符。
1.1 Sha-Bang
Sha-Bang 就是通常脚本开头的头两个字符“#!”连在一起的读音。一般说来,任何一个脚本程序都应以其为起始。它们就是脚本文件有执行权限就能被直接执行的秘密所在。
#!
是一个魔数(Magic,其值为 0x23,0x21),可执行文件在被读取的时候,内核通过这个特定的数字组合识别出这是一个需要运行解释器的脚本,并且根据约定将其后的字符串在读到换行以前解释成该脚本需要的解释器所在路径。然后系统根据路径调用解释器,最后再把整个文本的内容传递给解释器。脚本内容如何解释,执行什么动作就交由解释器负责。
所以,Shell 脚本虽然是一个纯文本文件,但依然可以被正常执行。
Shell 脚本,一般以 #!/bin/sh
或 #!/bin/bash
开头,表明脚本使用的解释器是 sh(POSIX Shell) 或者 bash。