目录
[Linux Shell 脚本基础](#Linux Shell 脚本基础)
[1. Shell 介绍](#1. Shell 介绍)
[2. 简单编写 Shell 脚本和执行](#2. 简单编写 Shell 脚本和执行)
[2.1 脚本编写规范](#2.1 脚本编写规范)
[2.2 示例:编写第一个 Shell 脚本](#2.2 示例:编写第一个 Shell 脚本)
[2.3 脚本执行方式](#2.3 脚本执行方式)
[3. Shell 变量(格式,使用,类型)](#3. Shell 变量(格式,使用,类型))
[3.1 变量定义格式](#3.1 变量定义格式)
[3.2 变量使用方式](#3.2 变量使用方式)
[3.3 变量类型](#3.3 变量类型)
[4. Shell 字符串(单引号,双引号,获取长度,提取,查找)](#4. Shell 字符串(单引号,双引号,获取长度,提取,查找))
[4.1 单引号与双引号的区别](#4.1 单引号与双引号的区别)
[4.2 获取字符串长度](#4.2 获取字符串长度)
[4.3 提取子串](#4.3 提取子串)
[4.4 查找子串](#4.4 查找子串)
[5. Shell 参数传递](#5. Shell 参数传递)
[5.1 常用位置参数变量](#5.1 常用位置参数变量)
[5.2 示例:参数传递与使用](#5.2 示例:参数传递与使用)
[5.3 \*和@的区别](#5.3 *和@的区别)
[6. Shell 运算符](#6. Shell 运算符)
[6.1 算术运算符](#6.1 算术运算符)
[6.3 逻辑运算符](#6.3 逻辑运算符)
Linux Shell 脚本基础
1. Shell 介绍
Shell 是 Linux 系统中连接用户与内核的 "命令解释器",它接收用户输入的命令,将其翻译成内核可理解的指令,执行后再将结果反馈给用户。简单来说,用户通过终端与 Shell 交互,间接操控 Linux 内核完成文件管理、进程控制、系统配置等操作。
常见的 Linux Shell 类型包括:Bash(Bourne Again Shell,Linux 系统默认 Shell,兼容性强、功能丰富)、Sh(Bourne Shell,早期基础 Shell)、Zsh(功能更强大的交互型 Shell,支持更多插件)等。其中 Bash 因默认预装、支持脚本编程和批量命令执行,成为企业运维中编写 Shell 脚本的首选。
Shell 的核心价值在于 "脚本编程"------ 将一系列 Linux 命令按逻辑组织到文本文件中,形成 Shell 脚本,通过执行脚本可自动化完成重复操作(如批量备份文件、定时检查服务状态、批量部署软件),大幅提升运维效率,减少人工操作失误。
2. 简单编写 Shell 脚本和执行
Shell 脚本是包含一系列命令的文本文件,编写与执行需遵循固定流程,以下为基础操作步骤:
2.1 脚本编写规范
- 指定解释器 :脚本第一行需通过 "#!"(称为 Shebang)指定 Shell 解释器,确保系统用正确的解释器执行脚本,默认 Bash 解释器写法为#!/bin/bash。
- 添加注释:用 "#" 开头的行表示注释,用于说明脚本功能、作者、编写时间或关键步骤,提升脚本可读性。
- 编写命令:将需执行的 Linux 命令按业务逻辑依次写入,命令格式与终端手动输入一致。
2.2 示例:编写第一个 Shell 脚本
需求:创建脚本hello.sh,实现 "输出欢迎信息 + 显示当前日期 + 列出当前目录文件" 功能,步骤如下:
用文本编辑器(如 vim)创建脚本文件:vim hello.sh。
写入以下内容:
#!/bin/bash
echo "欢迎使用shell脚本!

保存退出:按Esc键,输入:wq保存并退出 vim。
2.3 脚本执行方式
Shell 脚本执行需先确保文件有 "执行权限",常见执行方式有两种:
赋予执行权限后直接执行:
赋予权限:chmod +x hello.sh(+x 表示添加执行权限)。
执行脚本:若脚本在当前目录,可输入./hello.sh("./" 表示当前目录,)。

通过 Shell 解释器直接调用(无需执行权限):
格式:bash 脚本路径(或对应解释器,如sh hello.sh)。
示例:bash hello.sh,此方式无需提前赋予执行权限,适合临时测试脚本。

3. Shell 变量(格式,使用,类型)
Shell 变量用于存储数据(如字符串、数字、路径等),方便脚本中重复调用和修改,提升脚本灵活性。
3.1 变量定义格式
Shell 变量定义需遵循 "无空格" 原则,格式为:变量名=变量值,其中:
变量名:由字母、数字、下划线组成,不能以数字开头 (如name、file_1合法,1_file非法),建议使用大写字母,区分系统变量与自定义变量。
赋值符号 "=":两侧不能有空格 (如age=20合法,age = 20非法)。
变量值:若包含空格或特殊字符(如$),需用双引号或单引号包裹(如msg="Hello World")。

3.2 变量使用方式
使用变量时,需在变量名前加 ""符号,格式为`变量名或${变量名}`(后者在变量名与其他字符拼接时使用,避免歧义)。

只读变量: readonly 变量名=初始值 只读变量在初始化后不能修改初始值,只读变量不能被删除
删除变量(只能删除普通变量): unset 变量名

3.3 变量类型
Shell 变量无需显式声明类型,根据赋值内容自动区分,主要分为 3 类:
局部变量 :仅在当前 Shell 脚本或终端会话中生效,脚本执行结束或终端关闭后失效,如上述示例中的msg。
环境变量 :可在当前用户的所有 Shell 会话中生效,常用于传递系统配置(如PATH(命令搜索路径)、HOME(用户家目录)、USER(当前用户名)。
4. Shell 字符串(单引号,双引号,获取长度,提取,查找)
字符串是 Shell 脚本中最常用的数据类型,用于存储文本信息,支持单引号、双引号包裹,及长度获取、子串提取、内容查找等操作。
4.1 单引号与双引号的区别
单引号('') :强引用,包裹的内容原样输出 ,不解析变量、命令或特殊字符(如$、\)。
示例:输入 NAME="Linux"
然后输入echo '$NAME' 验证

双引号("") :弱引用,包裹的内容会解析变量和命令 (用(命令)或\`命令\`表示命令),特殊字符需用\\转义(如\\、\")。
示例:输入 NAME="Linux"
然后输入echo '$NAME' 验证

4.2 获取字符串长度
使用${#字符串变量名}格式,可快速获取字符串的字符个数(包括空格)。
示例:输入:msg="Hello Linux Shell"
然后输入echo "${#msg}" 验证

4.3 提取子串
从字符串中截取部分内容,格式为${字符串变量名:起始位置:截取长度},其中:
起始位置:从 0 开始计数(如字符串 "abcde",0 表示 "a",1 表示 "b")。
截取长度:可选参数,不指定则从起始位置截取到字符串末尾。
示例:以刚才的msg来提取,输入 echo "${str:0:5}"

4.4 查找子串
使用expr index "$字符串变量名" "查找的子串"格式,可获取子串中第一个字符在原字符串中的位置(从 1 开始计数,未找到返回 0);
示例:比如查找msg里的Linux里的L的位置,输入 echo `expr index "$msg" L `

5. Shell 参数传递
执行 Shell 脚本时,可向脚本传递参数(如./script.sh 参数1 参数2),脚本内部通过 "位置参数变量" 接收并使用这些参数,实现脚本的灵活调用。
5.1 常用位置参数变量
Shell 预设了一系列位置参数变量,用于接收外部传入的参数,核心变量如下:
0:表示脚本本身的文件名(如执行./hello.sh,0的值为./hello.sh)。
1:表示第一个参数,2表示第二个参数,......,9表示第九个参数;若参数超过 9 个,需用{10}、${11}表示(必须加{})。
$#:表示传入参数的总个数,用于判断参数是否完整。
\*:将所有参数视为一个整体字符串(如传入参数a b c,*的值为"a b c")。
@:将每个参数视为独立字符串(如传入参数a b c,@的值为"a" "b" "c")。
$?:表示上一条命令的执行结果(返回 0 表示执行成功,非 0 表示执行失败),常用于判断参数是否合法或命令是否执行成功。
脚本运行的当前进程 ID号 $! 后台运行的最后一个进程的 ID号 #### ******5.2 示例:参数传递与使用****** 创建脚本ce.sh,输入以下内容 #! /bin/bash echo "传入参数的总个数" $# echo "所有参数视为一个整体字符串 $\*" echo "脚本运行的但前进程号"
echo "后台运行的最后一个进程id号" $!
echo "将每个参数视为独立字符串 $@"
echo "判断命令是否正确" $?
echo $1
echo $2

wq保存,执行脚本输入 sh ce.sh 1 2 并判断结果

5.3 \*和@的区别
不被" "包含时:\*和@都以1 2... $n 的形式组成参数列表
被" "包含时:
*"\*" 会将所有的参数作为一个整体,以"1 2 ... n" 的形式组成一个整串
"@" 会将各个参数分开,以"1" "2" ... "n" 的形式组成一个参数列表
如
6. Shell 运算符
Shell 支持算术运算(如加减乘除)、比较运算(如大于、小于)和逻辑运算(如与、或),但需通过特定工具或语法实现,不能直接使用 "+、-、*、/" 等符号进行运算。
6.1 算术运算符
常用算术运算符包括:+(加)、-(减)、*(乘)、/(除,整数除法,舍去小数)、%(取余)、=(赋值)、==(等于,判断)、!=(不等于,判断)。
执行算术运算的 3 种常用方式:
使用 $((运算表达式)):最简洁的方式,支持所有算术运算符,示例:
分别输入 a=10,b=3,然后输入echo \[a+b\] 和 echo [a*b] 查看结果

使用 expr 运算表达式:需注意 "*" 需转义为\*,且运算符两侧需加空格。例如: 2+2 是不能运算的,必须写成 2 + 2 ,完整的表达式要被`符号包含,注意不是单引号,在 Esc 键下边
输入expr a + b 和 expr a \\\* b 查看结果

6.2 比较运算符
比较运算符主要用于判断数值大小或字符串是否相等,需在[](或[[]])中使用,核心运算符如下:
数值比较:-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)。
6.3 逻辑运算符
逻辑运算符用于组合多个判断条件,核心运算符如下:
&&(逻辑与):两个条件同时成立,结果为真。
||(逻辑或):两个条件任意一个成立,结果为真。
示例:a=10 b=3输入以下内容

&&不成立则输出为0
||成立,输出为1