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

news2024/11/17 21:24:09

目录

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.coloradmin.cn/o/1858872.html

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

相关文章

你还在手动操作仓库?这款 CLI 工具让你效率飙升300%!

前言 作为一名开发者,我经常会在 GitHub 和 Gitee 上 fork 各种项目。时间一长,这些仓库就会堆积如山,变成了“垃圾仓库”。每次打开代码托管平台,看到那些不再需要的仓库,我的强迫症就会发作。手动一个一个删除这些仓…

仿微信图片查看器`WPF`实现`ListBox` 鼠标滑动批量选中与反选效果

看到微信中,上传图片时的图片查看功能可以通过手指长按并滑动实现多选,于是为解析实现思路,也通过WPF 使用ListBox 实现了一版案例。 参考效果 微信效果如下,支持图片单选和鼠标长按滑动实现批量操作。 WPF模仿效果&#xff1a…

【代码仓库提交大文件,用Git LFS!】

开始前 Git LFS:请注意,你的远程仓库需要支持Git LFS。GitHub、GitLab和Bitbucket都支持Git LFS,但可能需要额外的配置或开启特定的支持选项。 介绍 Git LFS (Large File Storage) 是一个 Git 扩展,用于处理和存储大文件。通常…

【ai】tx2 nx: jetson Triton Inference Server 运行YOLOv4

【ai】tx2 nx: jetson Triton Inference Server 部署YOLOv4 部署了服务端。需要对其测试【ai】tx2-nx 查看 jetpack 版本信息及对应的tritonserver【ai】tx2-nx:配置tritonserver2.17.0-jetpack4.6 环境并运行例子C++ Triton YoloV4 client 是基于 r21.05的 服务端的tensort 的…

离散数学-再次复习

1.先找到e,这里是0 2.对每个元素求它的阶 3.根据拉格朗日定理,子群的阶必须是群 G 的阶的因数。群 G 的阶为 10,它的因数有 1、2、5 和 10。这意味着子群的阶可能是 1、2、5 或者 10。 4.相同阶的就放为一组,也就是它的一个子群…

Java面试复习思路

Java面试复习思路路线一: 准备Java面试时,可以从以下几个方面着手,以确保你能够自信且全面地展示你的技能和知识: 基础与核心概念: 确保你对Java基础有深入理解,包括但不限于:面向对象编程原则…

自从用了这个 69k star 的项目,前端小姐姐再也不催我了

一般在开发前后端分离的项目时,双方会定义好前后端交互的 http 接口,根据接口文档各自进行开发。这样并行开发互不耽误,开发好后做个联调就可以提测了。 不过最近也不知道怎么回事,公司新来的前端小姐姐总是在刚开始开发的时候就…

项目中eventbus和rabbitmq配置后,不起作用

如下:配置了baseService层和SupplyDemand层得RabbitMQ和EventBus 但是在执行订阅事件时,发送得消息在base项目中没有执行,后来发现是虚拟机使用得不是一个,即上图中得EventBus下得VirtualHost,修改成一直就可以了

Java-内部类成员内部类

类的五大成员 属性 方法 构造方法 代码块 内部类 什么是内部类? 在一个类的里面,再定义一个类。 举例:在A类的内部定义B类,B类就被称为内部类 内部类表示的事物是外部类的一部分 内部类单独出现没有任何意义 内部类的访问特点 1.…

lsopsed 安装与工程创建

Xposed与lsposed异同点 Xposed支持到安卓7.1 Xposed会将激活的模块注入到每个进程,需要自已在模块内根据包名过滤 Xposed激活模块后重启系统生效 lsposed支持安卓8.1-14 1sposed激活模块后需要勾选要作用于哪些app lsposed激活模块后重启对应app生效 lsposed模块…

Redis(超详细)

Redis Redis概念: Redis是开源的,遵循BSD的,基于内存数据存储,被用于作为数据库、缓存机制、消息中间件; Redis的特点: 1.高性能key/valu内存xing数据库; 2.支持丰富的数据类型 3.支持持久化&am…

Information security in DLMS/COSEM(Green-Book)—认证机制

Information security in DLMS/COSEM 9.2.1 概述9.2.2 DLMS/COSEM安全概念9.2.2.1 概述 9.2.2.1 概述9.2.2.2 身份识别和认证9.2.2.2.1 身份识别9.2.2.2.2 认证机制9.2.2.2.2.1 概述 无安全认证(Lowest Level Security):低级别安全认证&#…

python中数据的作用域

一、命名空间 在 Python 中,命名空间是一个系统,它用于确保名字的唯一性,并防止命名冲突。命名空间是一个存储变量名称(或者更广泛地说,标识符)与对象之间映射的抽象概念。每个变量名你在程序中创建&#x…

Redis-数据类型-zset

文章目录 1、查看redis是否启动2、通过客户端连接redis3、切换到db4数据库4、将一个或多个member元素及其score值加入到有序集key当中5、升序返回有序集key6、升序返回有序集key,让分数一起和值返回的结果集7、降序返回有序集key,让分数一起和值返回到结…

Android上编译和使用curl

1 概述 Android系统编译的时候默认是没有带curl工具的,但是在aosp源码中,却是有curl的源码包含。所以只需要编译curl,然后将其push到Android设备中,就可以使用curl命令了。 2 编译curl 这里编译curl是在整机代码环境下进行编译…

机器人控制系列教程之雅可比矩阵和奇异性

简介 在机器人学和控制理论中,雅可比矩阵扮演着至关重要的角色。它是一个描述机器人末端执行器速度与关节速度之间关系的数学工具。通过雅可比矩阵,我们可以更好地理解和控制机器人的运动,特别是在执行精确操作时。雅可比矩阵的计算通常基于…

python turtle 画帕恰狗

先上个图给大家看看 代码 ##作者V w1933423 import turtle turtle.bgcolor("#ece8dc") turtle.setup(600,900) p turtle.Pen() p.pensize(14) p.speed(5) p.color("black")p.penup() p.goto(-54,-44) p.pendown() p.goto(-37,-39) p.goto(-27,-24) p.go…

swp添加池子addLiquidity失败

案发现场 首次添加交易对、一直失败、但是也没提示具体的原因。到这一步就没了、由下图可知、也没看到log、由此可见第一步就失败了。 解决方案 工厂KywFactory 添加如下 bytes32 public constant INIT_CODE_PAIR_HASH keccak256(abi.encodePacked(type(KywPair).creatio…

0620所学——环境变量、CMake等

https://www.cnblogs.com/bravesunforever/p/10939078.html CMake: https://zhuanlan.zhihu.com/p/659412062 0621: 学会了在Github里创建组织,把本地仓库“同步”,就可以上传到Github,然后学会了把自己的Repos转移到组织里。G…

前端中的深拷贝

第1部分:引言 深拷贝:前端开发的隐形守护者 在前端开发的世界里,数据的传递和状态的管理是构建用户界面的基础。然而,数据的复制常常被忽视,直到它引发bug,我们才意识到它的重要性。深拷贝,这…