目录
[一. shell脚本概述](#一. shell脚本概述)
[1. shell的作用](#1. shell的作用)
[1.1 编制第一个 Shell 脚本](#1.1 编制第一个 Shell 脚本)
[2. 重定向与管道操作](#2. 重定向与管道操作)
[1. 重定向操作](#1. 重定向操作)
[(1) 重定向输出](#(1) 重定向输出)
[(2) 重定向输入](#(2) 重定向输入)
[(3) 错误重定向](#(3) 错误重定向)
[2. 管道操作](#2. 管道操作)
[二. shell变量的作用及类型](#二. shell变量的作用及类型)
[1. 自定义变量](#1. 自定义变量)
[1.1 定义新的变量](#1.1 定义新的变量)
[1.2 查看和引用变量的值](#1.2 查看和引用变量的值)
[2. 变量赋值的特殊操作](#2. 变量赋值的特殊操作)
[2.1 双引号("")](#2.1 双引号(“”))
[2.2 单引号(' ')](#2.2 单引号(' '))
[2.3 反撇号(`)](#2.3 反撇号(`))
[3. read 命令](#3. read 命令)
[4. 设置变量的作用范围](#4. 设置变量的作用范围)
[5. 数值变量的运算](#5. 数值变量的运算)
[三. 特殊的Shell变量](#三. 特殊的Shell变量)
[2. 位置变量](#2. 位置变量)
[3. 预定义变量](#3. 预定义变量)
前言
在 Linux 系统的日常管理和运维工作中,Shell脚本扮演着举足轻重的角色。通过编写 shell脚本管理员可以自动化执行大量重复性任务,从而提高工作效率,减少人为错误。
一. shell脚本概述
Shell脚本是 Linux 系统中一种强大的自动化工具,它将一系列的 Linux 命令组合起来,形成一个可执行的脚本文件。通过执行这个脚本文件,可以批量完成复杂的系统维护任务。而变量作为shell脚本中的核心元素,用于存储和管理脚本执行过程中的各种数据,为脚本提供了灵活性和动态性。
1. shell的作用
Linux 系统中的 shel1 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的 She11 解释器程序有很多种,使用不同的 shel1 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shel1s 文件可以了解当前系统所支持的 Shell脚本种类。

1.1 编制第一个 Shell 脚本
其中(/bin/bash)是目前大多数Linux版本采用的默认 Shell程序,Bash 的全称为 Bourne Again shell是受欢迎的开源软件项目之一。
什么是"Shell 脚本"? 简单地说,只要将平时使用的各种 Linux 命令按执行的先后顺序保存到一个文本文件中,然后添加可执限,这个文件就成为一个Shell脚本了。

添加可执行权限

www.sh 脚本文件中,包括3条命令:cd/boot、pwd、ls-lh vml*。执行此脚本文件后,输出结果与依次单独执行这3条命令的输出结果是相同的,从而实现了"批量处理"的自动伐过程。

一个合格的 Shell 脚本程序应该遵循标准的脚本结构,而且能够输出友好的提示信息,更加容易读懂。对于代码较多、结构复杂的脚本,应添加必要的注释文字。但在CentOS-8系统中只有bash执行程序,所以在填写脚本时放宽了填写脚本的注释声明。


第一行"#!/bin/bash"是一行特殊的脚本声明,(表示此行以后的语句通过binhash 程序来解释执行;其他以#)开头的语句表示注释信息;(echo)命令用于出字符事,以使脚本的输出信息更容易读懂。
直接通过"./"的方式执行脚本,要求文件本身具有x限,在某些安全系统中可能无法满足此条件。鉴于此,Linux 操作系统还提供了执行 Shell 脚本的其他方式------指定某个 Shell 程序解释脚本语句或通过内部命令(Source)(或点号"")加载文件中的源代码执行。

打开一个子shell执行脚本的指令 后退出子shell
- bash www.sh
- sh wwwsh
- ./www.sh(需要执行权限)
直接使用当前shell执行
2. 重定向与管道操作
由于 Shell 脚本"批量处理"的特殊性,其大部分操作过程以静默方式运行,不需要用户进行干预。因此学会提取,过滤执行信息变得十分重要。
1. 重定向操作
Linux 操作系统使用文件来描述各种硬件、设备等资源,如以前学过的硬盘和分区、光盘等设备文件。用户通过操作系统处理信息的过程中,包括以下3类交互设备文件.
|--------------|---------------------------------------------|
| 标准输入(STDIN) | 默认的设备是键盘,文件编号为0,命令将从标准输入文件中速取在执行过程中需要的输入数据。 |
| 标准输出(STDOUT) | 畎认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。 |
| 标准错误(STDERR) | 畎认的设备是显示器,文件编号为2.命令将执行期间的各种错送信息发送到标准错误文件。 |
标准输入、标准输出和标准错误献认使用键盘和是示器作为关联的设备,与操作系统进行交身完成最基本的输入、输出操作,即从键盘接收用户输入的各种命令字符串、辅助控制信息,并将命令结果输出到屏幕上。如果命令执行出错,也会将错误信息反馈到屏幕上。
(1) 重定向输出
重定向输出是指将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上,重定向输出使用">"或">>"操作符号,分别用于覆盖或追加文件。
如果重定向输出的目杨文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中。如果目标文件已经存在)则将输出结果覆盖或追加到文件中。

当需要保留目标文件原有的内容时,应改用""操作符号,以便追加内容而不是全部覆盖。

(2) 重定向输入
重定向输入是指将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入重定向输入使用"<"操作符。
通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成。例如,使用passwd命令为用户设置密码时,每次都必须根据提示输入两次密码字串,非常烦琐。如果改用重定向输入则可以省略交互式的过程,而自动完成密码的设置(结合passwd命令的(--stdin)选项来识别标准输入)。

错误示范

正确的

没有交互式的操作语句更方便在 Shel 脚本程序中使用,可以大大减少程序被打断的过程,提高脚本执行的效率。
(3) 错误重定向
错误重定向是指将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用2操作符,其中"2>"是指错误这件的编号。在使网标准输出。标准输入重定向时,可以省略文件的编号1,0。
在实际应用中,(错误重定向可用来收集程序执行的错误信息,为排错提供依据;对于Shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null山中,以保持脚本输出的简洁。

使用"2>"操作符时,会像使用">"操作符一样覆盖目标文件的内容。如果要追加内容而不是覆盖文件,则应改用"2>>"操作符。
当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用作符">"和"2>"将两类输出信息分别保存到不同的文件中,也可以使用"&>"操作符将两类输出信息保存到同一个文件中。

记得加执行权限
2. 管道操作
管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号"|"左侧的命令输出的结果将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。
提取前

提取后

上述代码中,(awk)命令的作思是以冒号":"作为分隔,输出第1个第7个区域的字符串。其中的"-F"部分用来指定分隔符号(未指定时,默认以空格或制表符分隔)。
如提取根分区(/)的磁盘使用率信息,可以执行以下操作,其中用到了df、grep、awk命令和管道操作。

二. shell变量的作用及类型
各种 Shell 环境中都使用到了"变量"的概念。Shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell程
序能够提供更加灵活的功能,其适应性更强。
常见的 shell 变量的类型包括自定义变量,环境变量,位置变量,预定义变量
1. 自定义变量
自定义变量是由系统用户自已定义的变量,只在用户自己的Shell环境中有效,因此又被称为本地变量。在编写 shell脚本程序时,通常会设置一些特定的自定义变量,以适应程序执行过程中的名种变化,满足不同的需要。
1.1 定义新的变量
Bash 程序中的变量操作相对比较简单,不像其他高级编程语言(如C/C++、Java 等)那么复杂在定义一个新的变量时,一般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容定义变量的基本格式为"变量名=变量值",等号两边没有空格。变量(名称需要以字母或下划线开头,名称中不要包含特殊字符(如+、-、*、/、.、?、%、&、#等)。

1.2 查看和引用变量的值
通过在变量名称前添加前导符号"$",可以引用一个变量的值。使用 echo 命令可以查看变量,在一条 echo 命令中,可以同时查看多个变量值。

当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号"{}"将其括起来,否则将无法确定正确的变量名称。对于未定义的变量,将显示为空值。
第一条没有变量没被定义所以是空的

2. 变量赋值的特殊操作
在等号"="后直接指定变量内容是为变量赋值的最基本方法。除此之外,还有一些特殊的赋值操作,可以更灵活地为变量赋值,以便适用于各种复杂的管理任务。
2.1 双引号("")
双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须使用双引号括起来其他情况下双引号通常可以省略。
错误赋值

正确赋值

在双引号范围内,使用"$"符号可以引用其他变量的值(变量引用),从而能够直接调用现有变量的值来赋给新的变量。
以变量的进行赋值

2.2 单引号(' ')
当要赋值的内容中包含S、"、\等具有特殊含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。但赋值内容中包含单引号)时需使用\'符号进行转义,以免冲突。

2.3 反撇号(`)
(反撤号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撒号括起来的范围内必须是能够执行的命令,否则将会出错。

上述操作相当于连续执行了两条命令--先通过 which useradd 命令查找出 useradd 命令的程序位
置,然后根据查找结果列出文件属性。在执行过程中,会使用which useradd 命令的输出结果替换整个反撒号范围中的内容。
使用反撒号难以在一行金令中实现嵌套命今的替换操作,这时可以改用"$0"来代替反撇号操作以解决嵌套的问题。例如,查询提供 useradd 命令程序的软件包所安装的配置文件的位置
3. read 命令
除了上述赋值操作,还可以使用 Bash 程序的内置命令(ead)给变量赋。read 命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给最后一个变量)。如果指定的变量只有一个,则将整行内容赋值给此变量。

如果交互中输错了 可以按住ctrl+删除键 就可以删除了
为了使交互式操作的界面更加友好,提高易用性,read命令可以结合"-p"选项来设置提示信息以便告知用户应该输入什么内容等相关事项。
4. 设置变量的作用范围
默认情况下,新定义的变量只在当前的 shel 环境中有效,因此称为部变量。当进入子程序或新的子Shell环境时,局部变量将无法再使用。
查看当前定义的变量值

进入子shell 环境 无法调用父及shell环境变量
返回原有的shell

为了使用户定义的变量在所有的子 Shell 环境中能够继续使用,减少重复设置工作,可以通过内(部命令export 将指定的变量导出为全局变量,用户可以同时指定多个变量名称作为参数(无须使用"$"符号),变量名之间以空格分隔。

使用export 导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值了。

5. 数值变量的运算
Shell变量的数值运算多用于脚本程序的过程控制,在 Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令expr进行,基本格式如下。需要注意,运算符与变量之间必须至少有一个空格。
expr 变量1 运算符 变量2 [运算符 变量 3]...
其中,变量 1、变量 2......对应为需要计算的数值变量(需要以"$"符号调用),常用的几种运算符如下
|------|--------------------------------|
| + | 加法运算 |
| - | 减法运算 |
| \* | 乘法运算,注意不能仅使用"*"符号,否则会被当作文件通配符 |
| / | 除法运算 |
| % | (求模运算)又被称为取余运算,用来计算数值相除后的余数 |

如果要将运算结果赋值给其他变量,可以结合命令替换操作(使用反撒号)

三. 特殊的Shell变量
除用户自行定义的 Shell 变量外,在 Linux 操作系统和 Bash Shell 环境中还有一系列的特殊变量环境变量、位置变量、预定义变量。
1.环境变量
环境变量是指出于运行需要而由Linux 操作系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿击目录,命今查找路径、用户当前目录、登录终端等。环境变量的值由Lin操系统自动维护,会随着用户状态的改变而改变。 使用env命令可以查看当前工作环境下的环境变量。  PATH变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时.Linux 操作系统将在 PATH 变量指定的目录范围査找对应的可执行文件,如果找不到则会提示"command not found" 。  设置完之后,一定要把文件路径更改过来,不然命令就用不了了  在 Linux 操作系统中,环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户 除此之外,每个用户还有自己的独立配置文件(一/.bash profile)。如果要长期变更或设置某个环境变量,应在上述文件中进行设置。 执行以下操作可以将记录的历史命令条数改为 100条(默认为 1000 条),只针对root 用户  上述修改只有当root用户下次登录时才会生效。如果希望立即生效,则应手动修改环境变量,者可以加载配置文件热行。  如果设置的命令条数为200,使用history \| wc -l 查看的条数为154 执行文件后再次查看会显示156条信息 那是因为已记录的条数不满200 所以使用命令会依次增加直到200条为止,第201条记录会把第一条记录顶替。 ### 2. 位置变量 为了在使用 Shell 脚本程序时,方便通过命令行为程序提供操作参数,Bash 程序引入了位置变量的概念。当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左右的顺序依次赋值给位置变量。 位置变量他被称为位置参数,使用$1、$2、83、...,$9表示。 当执行命令行"Is-lh /boot/时,其中第1个位置变量为"-lh",以"$1"表示;第2个位置变量为"/boot",以"$2"表示。命令或脚本本身的名称使用"$0"表示,虽然$0与位置变量的格式相同,但是$0属于预定义变量而不是位置变量。  ### 3. 预定义变量 预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用"s"符号和另一个符号组合表示,较常用的几个预定义变量的含义如下。 |-----|----------------------------------------------| | $# | 表示命令行中位置参数的个数 | | $\* | 表示所有位置参数的内容 | | $? | 表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常 | | $0 | 表示当前执行的脚本或程序的名称 | 为了说明预定义变量的作用,编写一个备份操作的小脚本,用来打包命令行指定的多个文件或目录,并输出相关信息。其中,新建的压缩包文件名称中嵌入时间戳,"date +%s"命令用于获取从1970年1月1日至今经过的总秒数。   确认备份结果 使用命令 ls -lh beifen-\*