Shell 编程基础(续):流程控制与实践

目录

前言

一、流程控制结构

[1.1 条件判断语句](#1.1 条件判断语句)

[1.1.1 if 语句](#1.1.1 if 语句)

二、输入输出重定向

[2.1 输出重定向](#2.1 输出重定向)

[2.2 输入重定向](#2.2 输入重定向)

[2.3 管道](#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(可执行)

示例:

①单支

案例一:

②双支

案例一:

案例二:

案例三:

bash 复制代码
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 嵌套结构,在第一个条件不满足时,再进行第二层条件判断

案例四:

bash 复制代码
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
文件文件
bash 复制代码
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 中非常强大的功能。

总结

bash 复制代码
1. &&:左成功,才执行右
2. ||:左失败,才执行右
3. > :覆盖stdout
   >>: 追加stdout
   2>和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)

今日份案例分享就到这里啦,明天继续哟~

相关推荐
知北游天24 分钟前
Linux网络:使用UDP实现网络通信(服务端&&客户端)
linux·网络·udp
半桔26 分钟前
【网络编程】TCP 粘包处理:手动序列化反序列化与报头封装的完整方案
linux·网络·c++·网络协议·tcp/ip
Freed&28 分钟前
Ansible 生产级自动化指南:Playbook、Handlers、Jinja2 全解析
运维·自动化·ansible
b***251131 分钟前
储能电池包的自动化产线探秘|深圳比斯特自动化
运维·自动化
ZeroNews内网穿透31 分钟前
新版发布!“零讯”微信小程序版本更新
运维·服务器·网络·python·安全·微信小程序·小程序
工控小楠32 分钟前
涡街流量计温度数据的协议桥梁:Modbus RTU 转 Profinet 网关的自动化应用
运维·自动化
<但凡.1 小时前
Linux 修炼:进程控制(一)
linux·运维·服务器·bash
m0_464608262 小时前
Ansible实现自动化运维
运维·自动化·ansible
✎﹏赤子·墨筱晗♪2 小时前
Ansible Playbook 入门指南:从基础到实战
linux·服务器·ansible
m0_464608262 小时前
Ansible Playbook:自动化配置管理的利器
运维·自动化·ansible