Shell 编程基础(续):流程控制与实践
目录
前言
一、流程控制结构
1.1 条件判断语句
1.1.1 if 语句
二、输入输出重定向
2.1 输出重定向
2.2 输入重定向
2.3 管道
总结
前言
在上一篇博客中,我们已经学习了 Shell 编程的基础知识,包括 Shell 脚本的概念、变量定义与使用、位置参数以及基本运算符等内容。本文作为续篇,将重点讲解 Shell 编程中的核心部分 —— 流程控制结构,包括条件判断、循环语句、函数定义与调用等关键知识点。掌握这些内容,能够帮助你编写逻辑更复杂、功能更强大的 Shell 脚本,实现自动化任务处理和系统管理。
一、流程控制结构
流程控制是编程中的核心概念,它决定了程序中语句的执行顺序。Shell 提供了丰富的流程控制结构,包括条件判断、循环语句和函数等。这也实现了运维在生产过程中的自动化管理。
1.1 条件判断语句
条件判断允许程序根据不同的条件执行不同的代码块。在 Shell 中,最常用的条件判断语句是if
语句和case
语句。
1.1.1 if 语句
if
语句是 Shell 中最基本的条件判断结构,它的基本语法如下:(单支)
if [ 条件表达式 ]; then# 条件为真时执行的命令
fi
除了基本的if
结构,还有(双支)if-else
和(多支)if-elif-else
结构,用于处理多种条件情况:
在条件表达式中,常用的比较运算符有:
- 数值比较:
-eq
(等于)、-ne
(不等于)、-gt
(大于)、-lt
(小于)、-ge
(大于等于)、-le
(小于等于) - 字符串比较:
=
(等于)、!=
(不等于)、-z
(空字符串)、-n
(非空字符串) - 文件测试:
-f
(普通文件)、-d
(目录)、-e
(存在)、-r
(可读)、-w
(可写)、-x
(可执行)
示例:
①单支
案例一:
②双支
案例一:
案例二:
案例三:
1.命令组合与管道操作
# 使用 netstat -antulp| grep ":80" 组合命令,通过管道 | 将 netstat 的输出传递给 grep 过滤包含 ":80" 的内容,实现对 80 端口状态的检查
# netstat -antulp 用于显示系统中所有监听的网络连接和相关进程信息2.退出状态码的显式引用
# 使用 $? 获取上一条命令的退出状态码,$? -eq 0 表示上一条命令执行成功3.系统服务管理
# 使用 systemctl restart httpd 重启 httpd 服务,这是 systemd 系统中管理服务的标准命令
# 通过 yum install -y httpd 安装 httpd 软件包,-y 选项用于自动确认安装过程中的所有提示
嵌套条件判断
采用 if...else 嵌套结构,在第一个条件不满足时,再进行第二层条件判断
案例四:
1.命令退出状态码的利用
# Shell 中,if 语句判断的核心是其后命令的退出状态码:
当 ls $a 执行成功(路径存在),退出状态码为 0,if 条件成立,执行 then 分支;
当 ls $a 执行失败(路径不存在),退出状态码非 0,if 条件不成立,执行 else 分支。
这是 Shell 中通过命令执行结果判断逻辑的典型方式。2.标准输出重定向
ls $a > /dev/null 中,> 是输出重定向符号,/dev/null 是特殊的 “空设备” 文件:
作用是将 ls 命令的正常输出(如目录内容列表)丢弃,避免干扰脚本的最终输出,只保留判断逻辑。
这种方式常用于 “只关注命令是否执行成功,不关心具体输出内容” 的场景。
③多支
案例一:
[root@77 shelldemo]# ./demo06.sh
快输:/etc
目录啦
[root@77 shelldemo]# vim demo06.sh
[root@77 shelldemo]# ./ demo06.sh
-bash: ./: 是一个目录
[root@77 shelldemo]# ./demo06.sh
快输:/zz
目录啦
[root@77 shelldemo]# ./demo06.sh
快输:/etc/root
不知道什么鬼玩意儿
[root@77 shelldemo]# ./demo06.sh
快输:/zz/shelldemo/err.txt
文件文件
1.交互输入
使用 read -p "快输:" a 实现与用户的交互,-p 选项用于显示提示信息,将用户输入的内容保存到变量 a 中2.条件判断结构
# 使用 if...elif...else 多分支条件判断结构,根据不同的条件执行相应的操作
# 条件判断的基本格式 [ 条件表达式 ],注意括号前后需要有空格3.文件类型检测运算符
-d $a:判断变量 a 所表示的路径是否为目录(directory)
-f $a:判断变量 a 所表示的路径是否为普通文件(file)
-e $a:判断变量 a 所表示的路径是否存在(exist)
-b $a:判断变量 a 所表示的路径是否为块设备文件(block device)4.执行逻辑
脚本会按照从上到下的顺序依次判断条件
一旦某个条件满足,就会执行对应的 echo 语句并退出整个条件判断结构
如果所有条件都不满足,则执行 else 部分的语句
二、输入输出重定向
在 Shell 中,每个进程都有三个默认的文件描述符:
标准输入(stdin,0)
标准输出(stdout,1)
标准错误(stderr,2)。
输入输出重定向允许我们改变这些默认的输入输出方向。
2.1 输出重定向
输出重定向用于将命令的输出保存到文件中,而不是显示在屏幕上:
>
:覆盖模式,将输出写入文件,会覆盖文件原有内容>>
:追加模式,将输出添加到文件末尾,不会覆盖原有内容
2.2 输入重定向
输入重定向用于从文件中读取输入,而不是从键盘输入。
2.3 管道
管道(|
)用于将一个命令的输出作为另一个命令的输入,这是 Shell 中非常强大的功能。
总结
1. &&:左成功,才执行右
2. ||:左失败,才执行右
3. > :覆盖stdout>>: 追加stdout2>和2>>用于stderr将stderr指向stdout:2>&1(顺序重要)同时重定向stdout+stderr :>file 2>&1(POSIX),或 &>file (bash)
4.丢弃输出:>/dev/null/ 2>/dev/null
5.管道|只传stdout; 要传两者用 2>&1 | 或 |& (bash)
今日份案例分享就到这里啦,明天继续哟~