当前位置: 首页 > 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.dtcms.com/a/357580.html

相关文章:

  • RustDesk(跨平台远程桌面软件) v1.4.1 中文绿色版
  • 单节锂电池,升压至12V/2.5A的芯片选型指南(附FP5207X 与 FP7208参数表)
  • 【大模型14】Fine-tuning与大模型优化1
  • 基于深度学习的文本情感分析系统:从理论到实践的全栈实现
  • UPDF for mac PDF编辑器
  • 表达式语言EL
  • 【0422】SMgrRelationData 中 md_num_open_segs 和 md_seg_fds 数组为什么是 4 个元素? 第四个元素表示什么?
  • 【观成科技】蔓灵花User下载者加密通信分析
  • 第二阶段WinForm-10:多线程
  • 亚马逊竞品分析新思路——从数据迷雾到精准截流
  • C++模板类的详细介绍和使用指南
  • 财务RPA机器人——解读 377页RPA财务机器人开发与应用—基于UiPath StudioX【前三章 附全文阅读】
  • [UVM]编写一个验证vld和rdy握手的断言
  • 第5篇 c++ 函数的多返回值实现-返回多个值
  • 工业智能体时代,制造业要不要建AI中台?
  • Day17 Docker学习
  • 【打包压缩】tar包和命令格式简介
  • 【完整源码+数据集+部署教程】植物病害检测系统源码和数据集:改进yolo11-EMSCP
  • 134-细粒度多尺度符号熵和鲸鱼优化算法的滚动轴承故障诊断技术MSVM
  • Parasoft C/C++test端到端透明可追溯的软件测试解决方案
  • 基于STM32单片机智能家居声音人体防盗GSM短信报警系统设计
  • 力扣452:用最少数量的箭射爆气球(排序+贪心)
  • 从“走过场”到“看得见”的成长:在线学习系统如何重塑企业培训价值
  • Unity DateTime 相关
  • 数据分析编程第六步:大数据运算
  • 【leetcode】114. 二叉树展开为链表
  • 死锁检测 及其测试用例
  • Linux的环境变量
  • 10迁移TiDB数据库数据到GaussDB
  • Java实现PDF表格转换为CSV