Bash 编程精粹:从新手到高手的全面指南之逻辑控制
在 Unix 和 Linux 系统中,Bash(Bourne-Again Shell)是一种广泛使用的 shell,提供了强大的脚本编程能力。本文将详细介绍 Bash 脚本中的逻辑控制结构,包括条件判断、分支选择、循环控制以及退出控制等内容。
条件判断:if
在 Bash 脚本中,我们常常需要根据某些条件来决定是否执行某个命令或者某段代码,这时就需要用到 if 语句。
- 基础的 if 结构:
if [ condition ] ; then ...;fi
如果 condition 为真,则执行 then 后面的代码块,否则跳过。
- if-else 结构:
if [ condition ] ; then ...;else ...;fi
如果 condition 为真,则执行 then 后面的代码块,否则执行 else 后面的代码块。
- if-elif-else 结构:
if [ condition ] ; then ...;elif ...;fi
如果 condition 为真,则执行 then 后面的代码块,否则检查 elif 的条件,如果为真则执行 elif 后的代码块,否则执行 else 后的代码块。
- 使用 && 和 || 替代 if:
[ -f file ] && echo file exist || echo file not exist
如果 -f file 为真,则输出 “file exist”,否则输出 “file not exist”。
分支选择:case、select
在某些情况下,我们可能需要根据变量的值来执行不同的代码块,这就需要使用到 case 或 select 语句。
- case 结构:
case $var in
p1) ... ;;
p2) ... ;;
...
pn) ... ;;
*) ...;;
esac
根据变量 var 的值,选择执行相应的代码块。
- select 结构:
Select var in var_list;do ....;done;
用户从 var_list 中选择一个值赋给 var,然后执行相应的代码块。
循环控制:for、while、until
在 Bash 脚本中,我们可以使用 for、while 或 until 语句来重复执行某段代码。
- for 循环:
for(( c1 ; c2 ; c3 ));
do
... ;
done
在 c1 和 c3 之间,每次增加 c2,执行一次循环体。
- for 遍历循环:
for f in $array[*];
do
.....
done
遍历数组 array 的每个元素,对每个元素执行一次循环体。
- while 循环:
i=0;
while ((i<3)) ;do
echo $i; ((i=i+1));
done
当 i 小于 3 时,执行一次循环体,并使 i 加 1。
- until 循环:
i=0;
until ((i>3));do
echo $i;
((i+=1));
done
当 i 不大于 3 时,执行一次循环体,并使 i 加 1。注意,until 循环与 while 循环的功能是相同的,只是判断条件的方向不同。
退出控制:return、exit、break、continue
在 Bash 脚本中,我们可以使用 return、exit、break 或 continue 语句来控制程序的流程。
-
return:用于函数的返回,返回一个整数值。
-
exit:用于结束当前的 shell 进程,后面可以跟一个整数值作为退出状态。
-
break:用于跳出当前的循环。
-
continue:用于跳过当前循环的剩余部分,进入下一次循环。
高级条件判断
在复杂的脚本中,我们经常需要基于多个条件进行判断。这时可以使用逻辑运算符 -a
(AND), -o
(OR), 和 !
(NOT) 来组合条件。
if [ $var -eq 1 -a $other -eq 2 ]; thenecho "Both conditions are true."
elif [ $var -eq 1 -o $other -eq 2 ]; thenecho "At least one condition is true."
elseecho "Neither condition is true."
fi
我们还可以使用括号 ()
来对条件进行分组,以及使用 !
对条件取反。
if [ $var -eq 1 ] && [ $other -eq 2 ]; thenecho "Both conditions are true."
fiif ! [ $var -eq 1 ]; thenecho "var is not equal to 1."
fi
循环控制技巧
在处理文件和数据时,我们经常需要编写复杂的循环。这里有一些有用的技巧:
-
使用
{start..end}
进行整数序列的迭代:for i in {1..5}; doecho $i done
-
使用
seq
命令生成数字序列:for i in $(seq 1 5); doecho $i done
-
利用
{start..end..step}
指定步长:for i in {0..10..2}; doecho $i done
-
使用
{commands;...}
在循环体中执行一组命令:for file in *; doif [ -d "$file" ]; thenls "$file"fi done
代码组织与函数
随着脚本的增长,我们需要更好地组织代码以提高可读性和可维护性。在 Bash 中,我们可以使用函数来封装重复的任务或逻辑。
function greet() {echo "Hello, $1"
}greet "World"
我们也可以使用源代码文件包含的方式来重用代码段。使用 source
或 .
命令可以包含其他脚本文件。
source common_functions.sh
or
. common_functions.sh
信号处理
Bash 脚本还可以处理来自用户或系统的中断信号,如 Ctrl+C
。我们可以捕获这些信号,并定义自己的处理行为。
trap 'echo "Interrupted!"; exit 1' INT
上面的代码会在用户按下 Ctrl+C
(发送 INT
信号)时输出一条消息并退出脚本。
结论
通过掌握 Bash 的逻辑控制结构,你可以编写出功能复杂且强大的脚本。记住,好的脚本不仅仅是工作的,还应该是其他人(包括未来的你)能够理解和维护的。因此,始终关注代码的清晰性、一致性和文档。当你的脚本变得越来越复杂时,不妨考虑使用函数、源代码包含和注释来保持代码的整洁和有序。最后,不要忘记测试你的脚本以确保它们按预期工作,特别是在不同的边缘情况下。
相关文章:
Bash 编程精粹:从新手到高手的全面指南之逻辑控制
在 Unix 和 Linux 系统中,Bash(Bourne-Again Shell)是一种广泛使用的 shell,提供了强大的脚本编程能力。本文将详细介绍 Bash 脚本中的逻辑控制结构,包括条件判断、分支选择、循环控制以及退出控制等内容。 条件判断&…...
自动化运维(三十)Ansible 实战之自定义插件
Ansible 自定义插件允许你扩展其功能,以满足特定的自动化需求。Ansible 支持多种类型的插件开发,如动态库存、查找、回调、过滤器、变量等。这里我们将通过实例,介绍如何开发、部署和使用一个自定义插件。 开发自定义查找插件 查找插件用于在 Ansible 任务中动态获取数据。…...

实习僧网站的实习岗位信息分析
目录 背景描述数据说明数据集来源问题描述分析目标以及导入模块1. 数据导入2. 数据基本信息和基本处理3. 数据处理3.1 新建data_clean数据框3.2 数值型数据处理3.2.1 “auth_capital”(注册资本)3.2.2 “day_per_week”(每周工作天数…...

C语言中局部变量和全局变量是否可以重名?为什么?
可以重名 在C语言中, 局部变量指的是定义在函数内的变量, 全局变量指的是定义在函数外的变量 他们在程序中的使用方法是不同的, 当重名时, 局部变量在其所在的作用域内具有更高的优先级, 会覆盖或者说隐藏同名的全局变量 具体来说: 局部变量的生命周期只在函数内部,如果出了…...

小程序中配置scss
找到:project.config.json 文件 setting 模块下添加: "useCompilerPlugins": ["sass","其他的样式类型"] 配置完成后,重启开发工具,并新建文件 结果:...

ZYNQ-Vitis(SDK)裸机开发之(四)PS端MIO和EMIO的使用
目录 一、ZYNQ中MIO和EMIO简介 二、Vivado中搭建block design 1.配置PS端MIO: 2.配置PS端EMIO: 三、Vitis中新建工程进行GPIO控制 1. GPIO操作头文件gpio_hdl.h: 2.GPIO操作源文件gpio_hdl.c: 3.main函数进行调用 例程开发…...

聊聊jvm中内存模型的坑
jvm线程的内存模型 看图,简单来说线程中操作的变量是副本。在并发情况下,如果数据发生变更,副本的数据就变为脏数据。这个时候就会有并发问题。 参考:https://www.cnblogs.com/yeyang/p/12580682.html 怎么解决并发问题 解决的…...

DevOps已死?2024年的DevOps将如何发展
随着我们进入2024年,DevOps也发生了变化。新兴的技术、变化的需求和发展的方法正在重新定义有效实施DevOps实践。 IDC预测显示,未来五年,支持DevOps实践的产品市场继续保持健康且快速增长,2022年-2027年的复合年增长率࿰…...
appium控制手机一直从下往上滑动
用于使用Appium和Selenium WebDriver在Android设备上滚动设置应用程序的界面。具体来说,它通过WebDriverWait和expected_conditions等待元素出现,然后使用ActionChains移动到该元素并执行滚动动作。在setUp中,它初始化了Appium的WebDriver和c…...

为什么光伏探勘测绘需要无人机?
随着全球对可再生能源需求的不断增长,光伏产业也迎来了快速发展的机遇。光伏电站作为太阳能发电的主要形式之一,其建设前期的探勘测绘工作至关重要。在这一过程中,无人机技术的应用正逐渐展现出其独特的优势。那么,为什么光伏探勘…...

day10 | 栈与队列 part-2 (Go) | 20 有效的括号、1047 删除字符串中的所有相邻重复项、150 逆波兰表达式求值
今日任务 20 有效的括号 (题目: . - 力扣(LeetCode))1047 删除字符串中的所有相邻重复项 (题目: . - 力扣(LeetCode))150 逆波兰表达式求值 (题目: . - 力扣(LeetCode)) 20 有效的括号 题目: . - 力扣&…...

深入解析Tomcat的工作流程
tomcat解析 Tomcat是一个广泛使用的开源Servlet容器,用于托管Java Web应用程序。理解Tomcat的工作流程对于开发人员和系统管理员来说是非常重要的。本文将深入探讨Tomcat的工作原理,包括请求处理、线程池管理、类加载、以及与Web服务器之间的通信。 ###…...

【web网页制作】html+css旅游家乡山西主题网页制作(3页面)【附源码】
山西旅游网页目录 涉及知识写在前面一、网页主题二、网页效果Page1、景点介绍Page2、酒店精选|出行攻略Page3、景色欣赏 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码4.1 主页模块源码4.2 源码获取方式 作者寄语 涉及知识 山西旅游主题网页制作&am…...
系统参数指标:QPS、TPS、PV、UV等
QPS QPS:Queries Per Second 是每秒查询率,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,即每秒的响应请求数,也即是最大吞吐能力。 TPS TPS:Tra…...
一入鸿蒙深似海,从此Spring是路人:鸿蒙开发面试题
详细内容请参考最新的官方鸿蒙文档,不保证时效性 写得不对的地方请多多指点,本文仅代表个人所学知识范围 联系方式QQ 1219723557,可一同交流学习 欢迎补充,希望能做一个汇总版本出来 1. 网络编程基本知识(较为简单&…...

【Python】使用OPC UA创建数据服务器
目录 准备工作服务器设置创建或获取节点设置节点值启动服务器查看服务器客户端总结 在工业自动化和物联网(IoT)领域,OPC UA(开放平台通信统一架构)已经成为一种广泛采用的数据交换标准。它提供了一种安全、可靠且独立于…...

JavaScript(六)-高级篇
文章目录 作用域局部作用域全局作用域作用域链JS垃圾回收机制闭包变量提升 函数进阶函数提升函数参数动态参数多余参数 箭头函数 解构赋值数组解构对象解构 遍历数组forEach方法(重点)构造函数深入对象创建对象的三种方式构造函数实例成员 & 静态成员…...
速盾:游戏cdn什么意思
CDN(Content Delivery Network)是指内容分发网络,它是由一组位于世界各地的服务器组成的网络,用于将内容有效地传输给用户。游戏CDN,顾名思义,就是用于游戏内容分发的网络。 在传统的网络传输模式中&#…...
数据库-Redis(11)
目录 51.什么是Redis事务? 52.Redis事务相关命令? 53.Redis事务的三个阶段?...

【网安小白成长之路】6.pikachu、sql-labs、upload-labs靶场搭建
🐮博主syst1m 带你 acquire knowledge! ✨博客首页——syst1m的博客💘 🔞 《网安小白成长之路(我要变成大佬😎!!)》真实小白学习历程,手把手带你一起从入门到入狱🚭 &…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...