Shell 的作用
Linux系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
编写第一个 Shell 脚本
Bash(/bin/bash) 是目前大多数Linux版本采用的默认 Shell。Bash 的全称为 Bourne Again Shell,是最受欢迎的开源软件项目之一。本课程中讲述的所有 Shell操作,均以Bash为例。
重定向与管道操作
由于 Shell 脚本“批量处理”的特殊性,其大部分操作过程以静默方式运行,不需要用户 进行干预。因此学会提取、过滤执行信息变得十分重要。本小节主要介绍 Shell 环境中的两个I/O操作:重定向和管道。
1. 重定向操作
Linux系统使用文件来描述各种硬件、设备等资源,如以前学过的硬盘和分区、光盘等设备文件。用户通过操作系统处理信息的过程中,包括以下几类交互设备文件。
标准输入(STDIN) : 默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
标准输出( STDOUT) : 默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。
标准错误 (STDERR) : 默认的设备是显示器,文件编号为2, 命令将执行期间的各种错误信息发送到标准错误文件。
(1)重定向输出
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件。
(2)重定向输入
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“
(3)错误重定向
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指 定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符,其中“2”是指错误文件的编号(在使用标准输出、标准输入重定向时,实际上省略了1、0编号)。
2. 管道操作
管道 (pipe) 操作为不同命令之间的协同工作提供了一种机制,位于管道符号“”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
Shell 变量的作用、类型
各种Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的 特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量, Shell 程序能够提供更加灵活的功能,适应性更强。
常见 Shell 变量的类型包括自定义变量、环境变量、只读变量、位置变量、预定义变量。本节将分别介绍这四种 Shell变量的使用。
自定义变量
1. 定义新的变量
Bash 中的变量操作相对比较简单,不像其他高级编程语言(如 C/C++、Java 等 ) 那 么复杂。在定义一个新的变量时, 一般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容)即可。
2. 查看和引用变量的值
通过在变量名称前添加前导符号“$”,可以引用一个变量的值。使用echo 命令可以查看变量,可以在一条echo 命令中同时查看多个变量值。
3. 变 量 赋 值 的 特 殊 操 作
在等号“=”后边直接指定变量内容是为变量赋值的最基本方法,除此之外,还有一些特殊的赋值操作,可以更灵活地为变量赋值,以便适用于各种复杂的管理任务。
( 1 ) 双 引 号 ( ")
双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号 括起来;其他情况下双引号通常可以省略。
(2)单引号(')
当要赋值的内容中包含$、“、\等具有特殊含义的字符时,应使用单引号括起来。在单 引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。但赋值内容中包含单引号(')时,需使用V符号进行转义,以免冲突。
(3)反撇号(‘)
反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括 起来的范围内必须是能够执行的命令行,否则将会出错。例如,若要在一行命令中查找useradd 命令程序的位置并列出其详细属性,可以执行以下操作。
(4) read 命令
除了上述赋值操作以外,还可以使用Bash 的内置命令read 来给变量赋值。 read 命令 用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入 一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。
4. 设置变量的作用范围
默认情况下,新定义的变量只在当前的 Shell 环境中有效,因此称为局部变量。当进入子程序或新的子 Shell 环境时,局部变量将无法再使用。
5. 数 值 变 量 的 运 算
Shell 变量的数值运算多用于脚本程序的过程控制(如循环次数、使用量比较等,后续 章节会介绍)。在 Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。
+:加法运算,
- :减法运算。
N*: 乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符。
1:除法运算。
%:求模运算,又称为取余运算,用来计算数值相除后的余数。
特殊的 Shell 变量
1. 环 境 变 量
环境变量指的是出于运行需要而由Linux 系统提前创建的一类变量,主要用于设置用户 的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。环境变量的值由Linux 系统自动维护,会随着用户状态的改变而改变。
2. 只读变量
Shell 变量中有一种特殊情况, 一经设定,其值是不可改变的,这种变量被称为只读变 量。在创建变量的时候可将其设置为只读属性,也可以将已存在的变量设置为只读属性,只 读变量主要用于变量值不允许被修改的情况。
3. 位 置 变 量
为了在使用 Shell脚本程序时,方便通过命令行,为程序提供操作参数, Bash 引入了 位置变量的概念。当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
4. 预 定 义 变 量
预定义变量是由Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而 不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另 一个符号组合表示,较常用的几个预定义变量的含义如下。
S#: 表示命令行中位置参数的个数。
$*: 表示所有位置参数的内容。
$?: 表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。关于$? 变量的使用将在下一章介绍。
$0: 表示当前执行的脚本或程序的名称。