03-Shell编程之循环语句与函数

目录

3.1 for循环语句

3.1.1for语句的结构

 3.1.2 for语句应用实例

3.2 使用whlie循环语句

1.打印数字1到5

3.3 使用until循环语句

3.3.1until的实例

1.打印数字1到5(使用until的逆向逻辑)

2.等待用户输入特定内容

3.4 函数

3.4.1Shell函数的基本语法如下:

示例

注意事项

3.5定义数组

3.5.1 访问数组元素

3.5.2 数组长度

3.5.3 数组操作和方法

3.1 for循环语句

在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清单检查各主机的存活状态,根据IP地址黑名单设置拒绝访问的防火墙策略等

当面对各种列表重复任务时,使用简单的if语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重。for 循环语句,可以很好地解决类似问题

3.1.1for语句的结构

使用for 循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里"取值列表”称为for语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP黑名单)。

for 循环语句的语法结构如下所示。

for variable in value1 value2 value3 ...  
do  # 在这里执行命令,使用$variable引用当前值  echo $variable  
done

上述语句结构中,for语句的操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于 do..done 之间的命令序列称为循环体,其中的执行语句需要引用变量以完成相应的任务。

for 语句的执行流程:首先将列表中的第一个取值赋给变量,并执行do...done 循环体中的命令序列:然后将列表中的第二个取值赋给变量,并执行循环体中的命令序列.….依此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环,如图所示。

 3.1.2 for语句应用实例

#!/bin/bash  list=("apple" "banana" "cherry")    //创建一个数组for fruit in "${list[@]}"          
do  echo "I like $fruit"          //输出遍历
done

 

3.2 使用whlie循环语句

hile 是一个控制结构,用于重复执行一段代码,直到某个条件不再满足为止。其基本语法如下:

while [ condition ]  
do  # 要重复执行的命令或代码块  
done

 其中,[ condition ] 是一个测试条件,如果条件为真(返回值为0),则执行 do 和 done 之间的命令或代码块。然后再次检查条件,如果条件仍然为真,则再次执行代码块,如此循环直到条件不再为真。

1.打印数字1到5

#!/bin/bash  counter=1  
while [ $counter -le 5 ]  
do  echo $counter  counter=$((counter+1))  
done

3.3 使用until循环语句

until循环与while循环相反,它在条件不满足时执行循环体,一旦条件满足就停止循环。

until [ condition ]  
do  # 循环体,条件不满足时执行的语句  ...  
done
  • [ condition ]:这是测试条件,如果条件为假(返回非零值),则执行do和done之间的语句。如果条件为真(返回零值),则停止循环。

3.3.1until的实例

1.打印数字1到5(使用until的逆向逻辑)

虽然通常我们会使用while循环来打印数字1到5,但也可以使用until循环通过逆向逻辑来实现:

#!/bin/bash  counter=1  
until [ $counter -gt 5 ]  
do  echo $counter  counter=$((counter+1))  
done

这里,我们设置了一个条件$counter -gt 5(即counter大于5),由于初始时counter为1,这个条件不满足,所以进入循环体。每次循环,counter增加1,直到counter大于5,条件满足,循环结束。

2.等待用户输入特定内容

假设我们想要等待用户输入"stop",一旦输入"stop",则停止循环:

#!/bin/bash  read -p "请输入内容(输入'stop'结束): " input  
until [ "$input" == "stop" ]  
do  echo "您输入了: $input"  read -p "请继续输入内容(输入'stop'结束): " input  
done  
echo "已接收到'stop'指令,退出循环。"

input变量中。然后,我们使用until循环来检查

input是否等于"stop"。如果不等于,就打印用户输入的内容,并再次提示用户输入。一旦用户入"stop",循环结束。

3.4 函数

我们通常不直接定义像其他编程语言(如C、Python或JavaScript)中的函数。但是,Shell脚本提供了一种称为“函数”或“shell函数”的机制,它允许你定义可重用的代码块。这些代码块可以在脚本的多个位置被调用。

3.4.1Shell函数的基本语法如下:

function_name() {  # 这里是函数的代码  # 可以是任意有效的shell命令  echo "Hello from $function_name"  
}

示例

下面是一个简单的示例,展示了如何定义和调用一个Shell函数:

#!/bin/bash  # 定义一个名为greet的函数  
greet() {  local name=$1  echo "Hello, $name!"  
}  # 调用greet函数并传递一个参数  
greet "World"  # 再次调用greet函数,这次传递一个不同的参数  
greet "Shell Scripting"

注意事项

  • 在函数内部,你可以使用$1、$2等来引用传递给函数的参数。就像在脚本的主体中引用位置参数一样。
  • 你可以使用local关键字在函数内部声明局部变量。这些变量只在函数内部可见,并且在函数结束时会被销毁。这有助于防止变量名冲突和意外的副作用。
  • 函数名通常以字母或下划线开头,并且不能包含空格或特殊字符(除了下划线)。函数名是大小写敏感的。
  • 你可以在脚本的任何位置定义函数,但通常建议在脚本的开头或接近开头的位置定义它们,以便在需要时轻松找到和引用它们。

3.5定义数组

在Bash中,数组是通过将值分配给连续的索引来定义的。索引可以是整数或字符串(在关联数组中)。

# 定义索引数组  
arr_index=(value1 value2 value3)  # 定义关联数组(Bash 4.0及以上版本)  
declare -A arr_assoc  
arr_assoc["key1"]="value1"  
arr_assoc["key2"]="value2"

3.5.1 访问数组元素

  • 索引数组:${arr_index[index]}
  • 关联数组:${arr_assoc[key]}

3.5.2 数组长度

  • 索引数组:${#arr_index[@]} 或 ${#arr_index[*]}
  • 关联数组:${#arr_assoc[@]} 或 ${!arr_assoc[@]}(后者列出所有键)

3.5.3 数组操作和方法

方法

描述

示例

定义数组

使用圆括号和空格分隔的值来定义数组

arr=(value1 value2 value3)

访问元素

使用${array[index]}访问索引数组的元素,${array[key]}访问关联数组的元素

echo ${arr[0]}

获取数组长度

使用${#array[@]}或${#array[*]}

获取索引数组的长度${#array[@]}

获取关联数组的长度(键的数量)

echo ${#arr[@]}

遍历数组

使用for循环遍历数组的所有元素

for i in "${arr[@]}"; do echo $i; done

关联数组键

使用${!array[@]}列出关联数组的所有键

echo ${!arr_assoc[@]}

追加元素

使用${array[@]}" new_element"

将新元素追加到数组末尾(注意:这实际上是创建了一个新的数组,原数组不变)

arr=("${arr[@]}" value4)

删除元素

使用unset array[index]删除索引数组的元素,unset array[key]

删除关联数组的元素

unset arr[1]

切片数组

Bash没有直接的切片功能,但可以通过循环和条件语句来实现

自定义实现

数组排序

使用sort命令或外部工具(如IFS

和循环)对数组进行排序

`for i in "arr[@]";doecho"i"; done

关联数组默认值

Bash 4.3及以上版本支持关联数组的默认值,使用

${array[key]:-default}

echo ${arr_assoc[key3]:default_value}

数组替换

使用${array[@]/pattern/replacement}

替换数组中的所有元素(Bash 4.0及以上版本)

new_arr=("${arr[@]/%foo/bar}")

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/859932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自学C语言-10

第10章 指针 指针是C语言的一个重要组成部分,是C语言的核心、精髓所在。用好指针,可以在C语言开发中起到事半功倍的效果。一方面,可以提高程序的编译效率、执行速度,以及动态存储分配;另一方面,可使程序更加…

playwright录制脚本原理

Paywright录制工具UI 在上一篇博客中介绍了如何从0构建一款具备录制UI测试的小工具。此篇博客将从源码层面上梳理playwright录制原理。当打开playwright vscode插件时,点击录制按钮,会开启一个新浏览器,如下图所示,在新开浏览器页…

Hive基础知识(十八):Hive 函数的使用

1. 系统内置函数 1)查看系统自带的函数 hive (hive3)> show functions; Time taken: 0.085 seconds, Fetched: 289 row(s) 2)显示自带的函数的用法 hive (hive3)> desc function upper; OK tab_name upper(str)- Returns str with all characters…

“了解MySQL中的enum枚举数据类型“

目录 # 开篇 1. 创建包含枚举类型的表 2. 插入枚举类型的数据 3. 查询包含枚举类型的表 4. 更新枚举类型的数据 5. 使用枚举类型的好处 注意事项 示例总结 附加 # 开篇 在数据库中,枚举(ENUM)是一种数据类型,用于存储一组…

即插即用篇 | 手把手教你 YOLOv10 添加注意力机制 | 20+ 种全打通!

YOLOv10 添加注意力机制 ! 视频教程地址-哔哩哔哩 文章目录 YOLOv10 添加注意力机制 !注意力机制介绍注意力机制的分类1. SE 注意力模块1.1 原理1.2 代码2. CBAM 注意力模块2.1 原理2.2 代码3. ECA 注意力模块3.1 原理3.2 代码4. CA 注意力模块4.1 原理4.2 代码5. 添加方式�…

构建开源多模态RAG系统

在这个新的冒险中,我们将深入研究使用开源大型语言多模态(LLMM)构建检索增强型生成(RAG)系统的过程。值得注意的是,我们的重点是在不依赖LangChain或Llama索引的情况下实现这一点;相反&#xff…

LabVIEW在机器人研究所中的应用

机器人研究所致力于机器人技术的研究与开发,涵盖工业机器人、服务机器人、医疗机器人等多个领域。研究所需要一个高效、灵活的实验控制和数据采集系统,以进行复杂的机器人实验,并对实验数据进行实时处理和分析。 项目需求 实时控制与监控&am…

NC--介绍-未加密加密后-流量抓包对比

免责声明:本节仅做技术交流与学习... 目录 介绍: 用法: 未加密--流量抓包 加密: 攻击端 靶机 抓包分析: 介绍: nc 是一个Linux环境下常用的工具命令,可以用来帮助开发者查询和解决网路问题,通常被认为是 NetCat 工具的缩写,在网络工具…

Hi3861 OpenHarmony嵌入式应用入门--轮询按键

本篇介绍使用轮询方式读取gpio状态来判断按键状态。 原理图如下 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpi…

MySQL理解-下载-安装

MySQL理解: mysql:是一种关系型数据库管理系统。 下载: 进入官网MySQLhttps://www.mysql.com/ 找到download 滑动到最下方:有一个开源社区版的链接地址: 然后就下载完成了 安装: 双击: 一直next 一直next这一步&…

仓颉编程语言入门

华为在 2024 年 6 月 21 日的华为开发者大会上,华为终端 BG 软件部总裁龚体正式官宣了华为自研仓颉编程语言,并发布了 HarmonyOS NEXT 仓颉语言开发者预览版。 仓颉编程语言文件后缀名为 .cj, 以下是第一个入门代码输出:你好,仓颉…

ESP32-S3方案应用设备无线交互技术,产品远程控制与语音交互

在物联网和人工智能(AI)技术融合的浪潮中,ESP32-S3芯片以其卓越的性能和多功能性,成为智能家居和工业自动化领域的明星产品。 ESP32-S3是一款基于Xtensa LX6处理器的嵌入式系统级芯片,具有高效、低功耗的特点。集成的Wi-Fi和蓝牙功能&#x…

三大交易所全面恢复 IPO 申请

6月21日晚间,北交所受理了3家企业的IPO申请,这是北交所时隔3个月之后恢复IPO受理。6月20日晚间,沪深交易所各受理了1家IPO申请,这是沪深交易所时隔半年后再次受理IPO。这也意味着,三大交易所IPO受理全部恢复。 6月21日…

致敬企业家精神:比亚迪仰望发布“旷野宣言”

近年来,随着汽车在中国的普及,钟爱越野和探险的车主群体也在飞速发展壮大。 那么问题就来了:为什么会有这么多的人们钟爱越野和探险?越野精神究竟是什么? 作为备受关注的硬派越野车,比亚迪旗下的高端品牌仰…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 08:剩下的就是态度问题

这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字,英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

C++基础编程100题-013 OpenJudge-1.3-11 计算浮点数相除的余数

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/11/ 描述 计算两个双精度浮点数a和b的相除的余数&#xff0c;a和b都是正数的。这里余数&#xff08;r&#xff09;的定义是&#xff1a;a k * b r&#xff0c;其中 k是整数&#xff0c; 0 < r < b。…

Spring Boot 快速入门4 ——JSR-303 数据校验

目录 一、前言 二、JSR303 简介 三、使用方法 常用注解 Validated、Valid区别 四、编写测试代码&#xff1a; 1. 实体类添加校验 2. 统一返回类型 3. 测试类 4.我们把异常返回给页面 5.抽离全局异常处理 2. 书写ExceptionControllerAdvice 一、前言 我们在日常开发…

鸿蒙开发系统基础能力:【@ohos.hiTraceChain (分布式跟踪)】

分布式跟踪 本模块提供了端侧业务流程调用链跟踪的打点能力&#xff0c;包括业务流程跟踪的启动、结束、信息埋点等能力。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import hi…

小鹏MONA M03实车曝光

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 小鹏汽车 MONA 系列首款车型已经官宣命名为“M03”&#xff0c;预计将于今年第三季度上市。 现在&#xff0c;这款新车的实车照片已经在网上流传开来。 此次曝光的是一款米色车漆版本&#xff0c;与当…

Twinkle Tray:屏幕亮度控制更智能

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Twinkle Tray2、核心特点 二、下载安装1、下载2、安装 三、使用方法 很高兴你打开…