目录
一、shell脚本是什么?
Shell 脚本(Shell Script)是一种文本文件,包含一系列按顺序执行的 Shell 命令,用于自动化完成特定任务。它就像一个 “命令的集合”,可以将复杂的操作流程写成脚本文件,通过一次执行脚本就能完成原本需要手动输入多条命令的工作
二、编写脚本

echo命令 用于向窗口输出文本。

给shell程序赋予执行权限:
给shell程序赋予执行权限: chmod +x ./hello.sh # 使脚本附有权限

2.2 执行Shell脚本

执行shell程序 提前:给shell程序授予可执行权限
第一种:./xxx.sh 在当前目录中执行shell程序
第二种:/xx/xxx.sh 书写全路径的shell程序
第三种:sh /xx/xxx.sh 把shell程序作用/bin/sh解释器的参数,通过运
行解释器来执行shell
三 、shell 程序:变量
3.1语法格式
变量的语法:变量名=值
注意: 等号两边不能有空格,同时变量名的命名须遵循如下规则:
首个字符必须为字母( a-z, A-Z)
中间不能有空格,可以使用下划线( _)
不能使用标点符号
不能使用 bash 里的关键字(可用 help 命令查看保留关键字)
3.2 变量使用
使用一个定义过的变量,只要在变量名前面加 $ 即可。
花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的
边界。
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改
变。
使用 unset 命令可以删除变量。 不能删除只读变量。
3.3 变量类型
变量的类型可以分为:局部变量、全局变量
局部变量:局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其
他 shell 启动的程序不能访问局部变量
四、字符串
4.1 字符串
是shell编程中最常用最有用的数据类型(除了数字和字符串,也没
啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不
用引号。
4.2 双引号
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
4.3 获取字符串长度

4.4 提取子字符串

4.5 查找子字符串的位置
五、参数传递
5.1参数传递
./shell程序[空格] 参数1 [空格] 参数2
shell程序脚本内获取参数的格式为: $n
n 代表一个数字, 1 为执行脚本的第一个参数, 2 为执行脚本的第二个参
数,以此类推......
$0 表示当前脚本名称

5.2 特殊字符
| $H | 传递到脚本参数的个数 |
| $* | 以一个单字符串显示所有向脚本传递的参数 |
| $$ | 脚本运行当前的ID号 |
| $! | 后台运行的最后一个进程ID号 |
| $@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
| $? | 显示最后命令的退出状态。0表示没有错误 其他表明有错误 |
5.2 $*和$@的区别
相同点: 都表示传递给脚本的所有参数。
不同点:
不被" "包含时:$*和$@都以$1 $2... $n 的形式组成参数列表
被" "包含时:
*"$*" 会将所有的参数作为一个整体,以"$1 $2 ... $n" 的形式组成一个
整串
"$@" 会将各个参数分开,以"$1" "$2" ... "$n" 的形式组成一个参数列
表
六、运算符
6.1 运算符的基本使用
Shell和其他编程语言一样,支持包括:算术、关系、逻辑、字符串等运算
符。
echo $1 # 接收第一个参数
$# #参数的个数
$* #参数列表 “$*”作为一个完整的字符串
$@ #参数列表 “$@”作为一个参数列表
/bin/bash不支持简单的数学运算,但是可以通过其他命令来实现,
例如:expr
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。


注意:
1、运算数和运算符之间要有空格。例如: 2+2 是不能运算的,
必须写成 `2 + 2`
2、完整的表达式要被`符号包含,注意不是单引号,在 Esc 键下边
案例2 :$(( ))


6.2 关系运算符
| -eq | 检测两个数是否相等,相等返回 true |
| -ne | 检测两个数是否不相等 不相等返回true |
| -lt | 小于应用于整型比较 |
| -gt | 检测左进的数是否大于右边如果是返回true |
| -le | 小于等于应用于整型比较 |
| -ge | 大于或等于应用于整型比较 |
6.3逻辑运算符
运算符
-a 双方都成立
-o 单方成立或表达式
6.4 字符串运算符
-n STRING字符串长度不为零 (非空字符串)
-z STRING字符串长度为0(空字符串)
= 判断两个字符是否一样
!=判断两个字符是否不一样
6.5 文件
文件测试运算符
-f 存在是普通文件
-d 存在且是目录
-s 文件不为空
-e 文件存在
-r 文件存在可读
-w文件存在并且可导
-x 文件存在可执行
七、流程控制
任何程序都有默认的执行流程,通常是从上向下逐行依次执行

选择:有选择性的执行某行或某段程序
重复:一直重复性的执行某行或某段程序,至到执行结束(条件控制循
环执行的次数)
7.1 if...else
单支


双支
执行机制:判断一次条件,有两个不同结果
条件成立(true):执行then后面的代码(命令1)
条件失败(false):执行else后面的代码(命令2)


7.2 for
循环流程控制:程序在执行时重复性的执行某行或某段代码。
不能出现死循环现象(在循环中添加条件用于在某个时刻结束循环
一个简单的循环必须具备:
1. 循环初始值
2. 循环条件
3. 修改循环条件
7.3 while

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变
量计算中不需要加上 $ 来表示变量
自加操作:let no++
自减操作:let no--

7.4 case

8 函数使用
8.1函数的简单使用

8.2 函数的参数
在 Shell 中,调用函数时可以向其传递参数。在函数体内部, 通过 $n 的
形式来获取参数的值,例如, $1 表示第一个参数, $2 表示第二个参数...
注意, 当 n>=10 时,需要使用${n} 来获取参数

8.3 函数的返回值

函数的调用: 函数名
函数中的参数传递:
在函数中接收传递的参数可以使用:$n 例:$1 $7 ${10}
调用函数时传递参数: 函数名 参数1 参数2
函数调用后接收返回值:
在函数中使用return 数据值的方式把数据返回出去
9 数组
数组可以理解为是一个用来存放多个值的容器。
数组中存储的数据,通常可以称为:元素。
当数组中存储了多个元素后,就会给每一个元素添加一个编号(索引),从0
开始。
9.1 定义数组
数组可以理解为是一个用来存放多个值的容器。
数组中存储的数据,通常可以称为:元素。
当数组中存储了多个元素后,就会给每一个元素添加一个编号(索引),从0
开始。
句式
array_name=((value1 value2 value3 ... valueN)
Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组
大小。
Shell 数组用括号来表示,元素用"空格"符号分割开,
9.2 读取数组
9.2.1

9.2.2 获取数组中的所有元素
使用@ 或 * 可以获取数组中的所有元素,例如:${array_name[*]}、${a
rray_name[@]}
9.2.3 获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:${#array_nam
e[*]}、${#array_name[@]}
660

被折叠的 条评论
为什么被折叠?



