当前位置: 首页 > news >正文

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)

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

http://www.xdnf.cn/news/1390933.html

相关文章:

  • Python Imaging Library (PIL) 全面指南:PIL图像处理异常处理与优化
  • 数据结构:选择排序 (Selection Sort)
  • JavaScript 中,判断一个数组是否包含特定值
  • 【完整源码+数据集+部署教程】停车位状态检测系统源码和数据集:改进yolo11-DCNV2-Dynamic
  • 机器学习入门,从线性规划开始
  • 基于 Selenium 和 BeautifulSoup 的动态网页爬虫:一次对百度地图 POI 数据的深度模块化剖析
  • el-table实现双击编辑-el-select选择框+输入框限制非负两位小数
  • SQL知识
  • Python的一次实际应用:利用Python操作Word文档的页码
  • 打造高效外贸网站:美国服务器的战略价值
  • ASCM使用手册
  • 从零开始构建卷积神经网络(CNN)进行MNIST手写数字识别
  • 彻底弄清URI、URL、URN的关系
  • BGP路由协议(二):报文的类型和格式
  • OpenAI宣布正式推出Realtime API
  • 网络_协议
  • Qt事件_xiaozuo
  • 快速深入理解zookeeper特性及核心基本原理
  • Replay – AI音乐伴奏分离工具,自动分析音频内容、提取主唱、人声和伴奏等音轨
  • rust打包增加图标
  • 常见视频编码格式对比
  • 【3D入门-指标篇下】 3D重建评估指标对比-附实现代码
  • 哈希算法完全解析:从原理到实战
  • Python OpenCV图像处理与深度学习
  • 网页提示UI操作-适应提示,警告,信息——仙盟创梦IDE
  • 【贪心算法】day4
  • 实现自己的AI视频监控系统-第二章-AI分析模块5(重点)
  • 【开题答辩全过程】以 基于SpringBootVue的智能敬老院管理系统为例,包含答辩的问题和答案
  • 为什么特征缩放对数字货币预测至关重要
  • 克隆态驱动给用户态使用流程