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}")

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

msvcp120.dll丢失怎么办,找不到msvcp120.dll的多种解决方法

最近,我在运行一个程序时遇到了一个错误,系统提示找不到msvcp120.dll文件,无法继续执行代码。这让我感到非常困扰,因为这个问题导致我无法正常运行这个程序。经过一番搜索和尝试,我找到了几种修复这个问题的方法&#…

Mysql索引底层数据结构——Java全栈知识(28)

Mysql索引底层数据结构 1、什么是索引 索引在项目中还是比较常见的,它是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本&…

【UEFI实战】HttpBoot

环境配置 首先下载tftpd工具,可以在phjounin / tftpd64 / Downloads — Bitbucket下载到,建议不要安装到C盘,因为可能无法修改其配置。配置tftpd工具的DHCP服务: 注意这里的IP地址需要跟实际网卡IP匹配。 下载Apache&#xff0c…

探秘神经网络激活函数:Sigmoid、Tanh和ReLU,解析非线性激活函数的神奇之处

引言 在神经网络中,激活函数扮演着至关重要的角色。它们赋予神经网络非线性的能力,使得网络具备学习和表示复杂函数关系的能力。本文将详细解析三种常见的激活函数:Sigmoid、Tanh和ReLU,揭开它们在神经网络中的奥秘。无论你是初学…

MOE学习笔记

MOE网络结构 和传统的 transformer 网络结构相比,我们将 Transformer 模型的每个 FFN 层替换为 MoE 层,MoE 层由门网络(Router)和一定数量的专家(Expert)组成。 这些 Expert 其实也是 FFN 层,…

光伏半导体的种类

光照射半导体材料时,其电导率发生变化的实质是光生载流子的产生。在半导体中,价带中的电子受到一定能量的光子激发后,可以跃迁到导带,形成自由电子和空穴对,即光生载流子。这些光生载流子会增加半导体的导电能力&#…

思考-生涯思考-GPT-5对人们的影响

GPT-5 一年半后发布?对此你有何期待? IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,…

MOC和MCS通讯流程分析

半导体行业-SECS/GEM协议 半导体设备通讯SECS协议是由国际半导体设备与材料协会(SEMI)的会员一起构建的连接性标准。它最初是为了在半导体/电子行业的自动化中实现设备与主机系统之间的通信而制定的。 SECS/GEM不仅允许客户查看设备的功能,…

使用 MongoDB 剖析开放银行:技术挑战和解决方案

开放银行(或开放金融)在银行业掀起了一股颠覆性浪潮,它迫使金融机构(银行、保险公司、金融科技公司、企业甚至政府机构)迎接一个透明、协作和创新的新时代。这种模式转变要求银行与第三方提供商(TPP&#x…

双 μC 的 PWM 频率和分辨率

该方法是过滤 PWM 信号的 HF 分量,只留下与占空比成正比的 LF 或 DC 分量。然而,低通滤波器并不能完全滤除PWM频率,因此LF/DC信号一般会有一些纹波。 有两种方法可以降低 PWM DAC 的纹波。可以降低低通滤波器的截止频率,或者提高…

编译原理大题自解(活前缀DFA、LR(0)分析表)

目录 4. (简答题) (1)给出识别活前缀的DFA (2)设计此文法的 LR(0)分析表 第一种解法 第二种解放 首先声明这是作者的写法(不保证正确!)仅供参考。本题因为可能存在冲突的原因,所…

SAPUI5基础知识9 - JSON Module与数据绑定

1. 背景 在前面的博客中,我们已经学习了SAPUI5中视图和控制器的使用,在本篇博客中,让我们学习下MVC架构中的M-模型了。 SAPUI5中的JSON Model是一个客户端模型,可以用于在SAPUI5应用程序中处理和操作JSON数据。SAPUI5提供了绑定…

爬虫笔记15——爬取网页数据并使用redis数据库set类型去重存入,以爬取芒果踢V为例

下载redis数据库 首先需要下载redis数据库,可以直接去Redis官网下载。或者可以看这里下载过程。 pycharm项目文件下载redis库 > pip install redis 然后在程序中连接redis服务: from redis import RedisredisObj Redis(host127.0.0.1, port6379)…

【D3.js in Action 3 精译】第一部分 D3.js 基础知识

第一部分 D3.js 基础知识 欢迎来到 D3.js 的世界!可能您已经迫不及待想要构建令人惊叹的数据可视化项目了。我们保证,这一目标很快就能达成!但首先,我们必须确保您已经掌握了 D3.js 的基础知识。这一部分提到的概念将会在您后续的…

【物联网】物联网操作系统简介

目录 一、物联网操作系统概述 1.1内存占用 1.2 内存管理 二、物联网操作系统构成 三、物联网操作系统关键特性 3.1 调度方式 3.2 I/O操作方式 3.3 网络服务 3.3.1 TinyOS网络协议栈 3.3.2 LiteOS网络协议栈 一、物联网操作系统概述 物联网操作系统是支撑物联网大规模…

倩女幽魂搬砖攻略:2024搬砖攻略大全!云手机强力辅助!

《倩女幽魂》手游是一款具有极高自由度和丰富玩法的角色扮演游戏。为了帮助玩家更好地了解并掌握游戏中的各种技巧和策略,本文将为大家提供详细的攻略指南。我们将从每日签到、任务升级、银两经营、必做活动和出金等多个方面详细介绍,帮助玩家轻松玩转游…

ONLYOFFICE 桌面编辑器 8.1重磅来袭:全新功能提升您的办公效率

文章目录 前言ONLYOFFICE 桌面编辑器8.1一、PDF编辑:告别“头痛”时刻二、幻灯片版式:秒变“设计大师”三、无缝切换:办公界的“快速通道”四、语言支持:全球通吃的“翻译官”五、 隐藏“连接到云”板块:摆脱“云”的束…

索引的分类和回表查询——Java全栈知识(29)

索引的分类和回表查询 Mysql 的索引按照类型可以分为以下几类,但是我们使用的 InnoDB 只支持主键索引,唯一索引,普通索引,并不支持全文索引。 1、聚集索引和二级索引 InnoDB 可以将索引分为两类分别是聚集索引和二级索引&…

Navicat连接服务器MySQL

Navicat连接服务器MySQL 1. Navicat连接服务器MySQL2. 如何查看MySQL用户名和密码3. 修改MySQL登录密码4. 安装MySQL(Centos7)遇到错误和问题1. error 1045 (28000): access denied for user rootlocalhost (using password:yes) 1. Navicat连接服务器MySQL 选择数据库 直接使用…

低价可转债崩盘,发生了什么?

下跌不在于“出库”,甚至不在于“风险”。问题更多在于交易层面,何时能积聚更多的左侧资金并成功过渡至右侧。 低价券怎么了? 如果说6月初主要是小微盘品种的退市风险,后来是一些评级下调的品种,到本周,已…