1246 字
6 分钟
Shell脚本编程
Shell 脚本编程
Shell 脚本简介
Shell 脚本是什么?
- Shell 命令按一定语法组成的可执行文件
Shell 脚本有什么用?
批处理文件/整合命令
- 软件启动
- 性能监控
- 日志分析
…
Shell 内置命令/外部命令
可通过 type 命令来查询是内置还是外置命令

内置命令和外置命令的区别
内置命令
- shell 本身的一部分(大部分由 c 编写),由 shell 直接实现的,直接由 shell 解释和执行,不需要启动新的进程
- 速度快:由于内部命令直接由 shell 执行,不需要启动新的进程,因此执行速度较快。
- 节省资源:不需要额外的进程,因此对系统资源的占用较少。
外置命令
- 外部命令是独立的可执行文件,通常位于系统的文件系统中(如
/bin、/usr/bin、/usr/sbin等目录)。 - 外部命令需要启动一个新的进程来执行。shell 通过
fork()系统调用创建一个子进程执行该命令。 - 速度较慢:由于需要启动新的进程,外部命令的执行速度通常比内部命令慢。
- 占用资源:每次系统都会创建一个新的进程,因此会占用更多的系统资源
Shell 是解释型语言
- 编译型语言:- 源代码在执行前由编译器转化为机器代码(可执行文件),执行时直接运行机器代码,速度较快。例如:C、C++、Go。
- 解释型语言:源代码在运行时由解释器逐行翻译成机器代码并执行,执行速度较慢,但开发过程灵活。例如:Shell、Python、JavaScript、Ruby。
常用的 Shell 解释器有哪些?
/etc/shells
一个 Shell 脚本创建到运行的流程
Helloworld
编辑、保存
vim hello.sh
改权限、运行/排错
chmod 777 hello.sh
./hello.sh
Shell 启动方式
- 作为程序执行
- 指定解释器运行
- Source 和.

Shell 脚本语法讲解
定义变量
定义语法中不能有空格
- Variable=value (变量值中不能有空格)
- Variable=‘value’(变量值中能有空格,所见即所得)
- Variable=“value”(变量中可以存在对其他变量的引用)
使用变量
- $variable
注意:当后面还要接数据的时候要用{}括起来,不然会把后面的数据认为是变量名的一部分
- ${variable}
将命令的结果赋值给变量
variable=`command `
Variable=$(command)


删除变量
- unset
特殊变量
| 变量 | 含义 |
|---|---|
| $0 | 当前脚本的文件名。 |
| $n(n≥1) | 传递给脚本或函数的参数。N 是一个数字,表示第几个参数。例如,第一个参数是 2。 |
| $# | 传递给脚本或函数的参数个数。 |
| $* | 传递给脚本或函数的所有参数。 |
| $@ | 传递给脚本或函数的所有参数。当被双引号 " " 包含时,* 稍有不同. |
| $? | 上个命令的退出状态或者获取函数返回值。 |
| $$ | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。 |
字符串拼接
并排放

读取从键盘输入的数据
Read
示例 1:


示例 2:输出提示文字


退出当前进程
Exit
对整数进行数学运算
(())


逻辑与/或
command1 && command2
command1 || command2
判断条件语句
Test expression 和[ expression ]

解释:如果 inputA 与 inputB 相等,则继续执行后面代码。第三行与第四行等价,一般使用第四行[]这一种方式
| 选项 | 作用 |
|---|---|
| -eq | 判断数值是否相等 |
| -ne | 判断数值是否不相等 |
| -gt | 判断数值是否大于 |
| -lt | 判断数值是否小于 |
| -ge | 判断数值是否大于等于 |
| -le | 判断数值是否小于到等于 |
| -z str | 判断字符串 str 是否为空 |
| -n str | 判断字符串 str 是否为非空 |
| =和== | 判断字符串 str 是否相等 |
| -d filename | 判断文件是否存在,并且是否为目录文件。 |
| -f filename | 判断文件是否存在,井且是否为普通文件。 |
管道
Command 1 | command 2
If 语句
if condition
then
do-something
fi


If else 语句
if condition
then
do-something
else
do-something
fi


If elif else 语句
if condition1
then
do-something
elif condition2
then
do-something
...
else
do-something
fi


Case in 语句
case expression in
conditon1)
do-something
;;
conditon2)
do-something
;;
*)
else do-something
;;
esac


For in 循环
for variable in value_list
do
do-something
done
Value_list
- 直接给出具体的值
- 使用一个取值范围
- 使用命令的执行结果
- 使用 Shell 通配符
- 使用特殊变量
直接给出具体的值


使用一个取值范围


使用命令的执行结果
和使用 Shell 通配符(*为通配符)[[Linux通配符]]


使用特殊变量(上文提到)


While 循环
while conditon
do
do-something
done


函数
function function_name(){
do-something
[return value]
}
无返回值无参数函数


有返回值有参数函数
- 使用 2 等特殊变量来获取函数参数
- 使用 $? 获取返回值(注意:多个函数调用返回值会覆盖这个特殊变量)


