Shell编程中的循环语句和函数

一、for循环语句

        当面对各种列表重复任务时,使用简单的if语句已经难以满足需求,这时就需要for循环语句。for语句的结构为:

for 变量 in 取值列表

do

        命令序列

done

使用for循环语句时,需要指定一个变量及取值列表,针对不同的取值重复执行相同的命令序列,直到列表中的变量用完之后,退出循环。

        for循环的执行流程为:
 

         for循环的应用实例:根据IP地址检查主机状态。

 得出结果为:

二、使用while循环语句

        for循环语句适用于列表对象无规律,且列表来源已固定的场合。而对于按照特定条件执行重复操作的情况,则while更适合。

        在脚本应用中,while可以根据特定的条件反复执行一个命令序列,直到该条件不再满足为止。使用while时也应该注意,不要出现死循环的情况,死循环会导致while中的命令序列会一直重复执行,后边的命令操作将无法执行,因此,应在while内部写入修改测试条件的语句,以便在适当的时候跳出循环。

        while的语法结构:

while 条件测试操作

do

        命令序列

done

        while执行的流程为:

        while循环实例:猜价格游戏

        

三、until循环语句

        until循环与while循环类似,while循环能实现的脚本unti同样也可以实现,但区别是while循环在条件为真是继续执行循环,而unti则是在条件为假时执行循环。until的语法结构和while相似,流程也一样唯一不同的while是条件为真时才会循环,until是条件为假时才会循环。

        until循环实例:计算1~50的和

        

四、shell函数

        Shell函数可用于存放一系列的指令。在Shell脚本执行过程中,函数被之于内存中,每次调用函数时不需要从内存读取,因此运行的速度比较快。通过编写、使用函数,可以提高程序可读性与重用性,避免编写大量重复代码。

        Shell函数定义的方法如下:

[function] 函数名() {

        命令序列

        [return x]

}

  • “function”关键字表示定义一个函数,可以省略;
  • {"符号表示函数执行命令的入口,该符号可以与函数名同行也可以在函数名下一行的句首;
  • }”符号表示函数体结束,两个大括号之间{}是函数体;
  • “命令序列”部分可以是任意的 Shel 命令,也可以调用其他函数;
  • “return”表示退出函数返回一个退出值,通过返回值判断执行是否成功,也可以使用 exit 终止整个 Shell 脚本。

        Shell函数的调用的方法为:函数名 [参数1] [参数2]...。

4.2 函数变量的作用范围

        函数变量的作用范围分为:

  • 局部:局部变量只在函数内部有效,在函数外部不能调用。通常在函数名前加一个"local"关键字来声明局部变量,且只能在声明的函数内部使用。
  • 全局:在整个脚本中都能够使用,注意声明时不要与局部变量冲突。

4.3 函数的参数

        函数参数的用法如下:

函数名称  参数1 参数2 参数3......

在使用函数内部使用函数参数时,要使用"$n"这中形似使用,n是第n个参数。而从第10个参数开始,调用时要用"${n}"的方式。

4.4 递归函数

        递归函数就是指函数自己调用自己。例如:

myFunction() {

        if [ $1 -gt 0 ]

        then

                local num=$1

                let "num=$num-1"

                myFunction $num #这里递归地调用了自己

        fi

}

myFunction 5

五、 Shell数组

        在Shell脚本中,数组是一种常见的数据结构,主要的应用场景包括:获取数组长度、获取元素长度、遍历元素、元素切片、元素替换、元素删除等等。Shell 中的数组与Java、C、Python不同,只有一维数组,没有二维数组。数组元素的大小与限制,也不需要事先定义。Shell 数组用括号()来表示,元素用空格分隔,元素的下标与大部分编程语言类似从0开始。

        数组常用定义方法包括以下几种:

  1. 数组名=(value0 value1 value2......)
  2. 数组名=([0]=value [1]=value [2]=value......)
  3. 列表名=“value0 value1 value2......”           数组名=($列表名)
  4. 数组名[0]=“value”

        数组名[1]=“value”

        数组名[2]=“value”...

        下面通过具体的示例了解数组的基本使用方法:

        1. 获取数组长度

arr_number=(1 2 3 4 5)

arr_length=$(#arr_number[*])

echo $arr_number

5 #输出5

        2. 读取某下表赋值

arr_index2=${arr_number[2]}  #第三个元素

echo $arr_index2

2 #输出2

        3. 数组遍历

        4. 数组切片

arr=(1 2 3 4 5)

echo ${arr[@]} #输出整个数组

1 2 3 4 5 #输出

echo ${arr[@]:0:2}  #${数组名[@或*]:起始位置:长度}

1 2 #输出

echo ${arr[@]:2:3}

3 4 5

        5. 数组替换

arr=(1 2 3 4 5)

echo ${arr[@]/4/66}  #${数组名[@或*]/查找字符/替换字符}

1 2 3 66 5

echo ${arr[@]}  #并不会替换数组原有内容

arr=(${arr[@]/4/66})  #要实现改变原有数组,开通过重新赋值来实现

echo ${arr[@]}

1 2 3 66 5

        6. 数组删除

arr=(1 2 3 4 5)

unset arr  #删除数组

echo ${arr[*]}

arr=(1 2 3 4 5)

unset arr[2]   #删除第三个元素

echo ${arr[*]}

1 2 4 5

六、脚本调试

        为避免编写的脚本出错,除了在编写脚本时注意书写规范,排除语法错误,更重要的是利用调试脚本工具来调试脚本。echo命令是最有用的调试脚本工具之一,一般在可能出现问题的脚本中加入echo命令,采用的是分段排查的方式。除了echo命令之外,bash Shell也有相应参数可以调试脚本。使用bash命令参数调试,命令的语法为:

sh [-nvx] 脚本名

其中参数的含义为:

  • -n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
  • -v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也给出错误提示。
  • -x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。

当脚本过长时,可以通过"set"命令,只调试部分脚本。通过在要调试脚本的上一行写上"set -x",在脚本末行的下一行写上"set -x"即可调试中间的脚本。

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

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

相关文章

2、python环境的安装-mac系统下

打开官网,downloads下边有macOS,点击: 选择最新版本,点击,进入下边的页面,一直往下滑,看到files中有个macOS的版本,点击下载 点击下载后是pkg的安装包,点击安装。 一步步…

鸿蒙OS开发:【一次开发,多端部署】(app市场首页)项目

一多应用市场首页 介绍 本示例展示了应用市场首页,页面中包括Tab栏、运营横幅、精品应用、精品游戏等。 本示例使用一次开发多端部署中介绍的自适应布局能力和响应式布局能力进行多设备(或多窗口尺寸)适配,保证应用在不同设备或…

蓝桥杯第1022题 玩具蛇 基础DFS C++ Java

题目 思路和解题方法 问题理解:此题要求找出将一条由16节正方形构成的玩具蛇放入4x4的方格中的不同方式数。每节蛇可以是直线或直角转弯,且蛇的形状需要完全覆盖盒子里的16个格子,每个格子仅被蛇的一个部分占据。 状态表示:使用一…

爷爷看了都会,打工人必备的摸鱼AI神器!免费!

去年,AI技术无疑成为了最为引人注目的焦点,层出不穷的创新应用令人目不暇接。尽管许多人对这股AI热潮的持久性持怀疑态度,但现实却用事实给予了最有力的反驳。AI所展现出的强大生产力,足以令人刮目相看。 而今年以来,…

VUE3学习第一篇:启动ruoyi

1、找到ruoyi的vue3版本 然后下载代码到本地, 我刚开始用的nodejs14报错, 后面换成nodejs16,启动前端成功了。 页面如下图所示

【JPCS出版,EI稳定检索会议推荐】第四届计算机、遥感与航空航天国际学术会议(CRSA 2024)已成功申请JPCS出版,火热征稿中!

【EI核心、Scopus】第四届计算机、遥感与航空航天国际学术会议(CRSA 2024)将于2024年7月5-7日在日本大阪举行。计算机、遥感与航空航天国际学术会议为来自世界各地的研究学者、工程师、学会会员以及相关领域的专家们提供一个关于“计算机科学”、“遥感技…

体验SmartEDA的高效与便捷,电子设计从未如此简单

SmartEDA:革新电子设计,让高效与便捷触手可及 在快节奏的现代生活中,科技日新月异,各行各业都在寻求更高效、更便捷的解决方案。对于电子设计行业而言,SmartEDA的出现,无疑是一场革命性的变革。它以其高效…

【PG16】后 EL 7 时代,PG 16 如何在 CentOS 7 上运行

↑ 关注“少安事务所”公众号,欢迎⭐收藏,不错过精彩内容~ ★ 本文写于 2023-09-29 PostgreSQL 16 Released 9/14, PostgreSQL 16 正式发布。从发布公告^1 和 Release Notes^2 可以看到 PG16 包含了诸多新特性和增强改进。 性能提升,查询计划…

Genzai:一款针对物联网安全的多功能实用性工具套件

关于Genzai Genzai是一款针对物联网安全的多功能实用性工具套件,该工具旨在识别与物联网相关的仪表盘,并扫描它们以查找默认密码和安全问题,广大研究人员可以使用该工具来检测和提升物联网设备的安全性。 Genzai支持用户以输入的形式提供一个…

简爱的思维导图怎么做?从这三个角度

简爱的思维导图怎么做?《简爱》作为夏洛蒂勃朗特的代表作,不仅是一部经典的爱情小说,也是探索女性独立与自我成长的文学巨著。为了深入理解这部作品,制作思维导图是一种高效的学习和分析工具。以下是三种不同的角度来创建《简爱》…

探讨开源与闭源大模型在AI领域的发展前景与挑战

一、引言 随着人工智能(AI)技术的飞速发展,大模型已成为推动AI技术进步的核心动力。在AI大模型的发展过程中,开源与闭源两种不同的发展路径各自展现出了独特的发展前景与挑战。本文将深入探讨这两种路径在AI领域的发展前景&#…

在马达驱动上的MOS产品选型分析与应用

电机的应用非常广泛,可以说大部分动的产品内部都有电机的身影,其主要的应用领域有风机、泵、散热风扇、电动工具、智能家居、以及汽车应用等等。随着各国出台了更加严格的用电标准,节能电机成为了市场关注的热点,而BLDC电机具有高…

K8S集群中Yaml文件详解

目录 一、Yaml概述 二、Yaml基本语法 三、Yaml数据结构 四、K8S资源清单描述方法 五、api资源版本标签 六、Yaml文件示例详解 1.deployment.yaml文件详解 2.Pod yaml文件详解 3.Service yaml文件详解 七、Yaml文件相关操作 1.试运行 2.生成yaml格式 3.生成json格式…

手搓顺序表(C语言)

目录 SeqList.h SeqList.c 头插尾插复用任意位置插入 头删尾删复用任意位置删除 SLtest.c 测试示例 顺序表优劣分析 SeqList.h //SeqList.h#pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h> #define IN_CY 3typedef int S…

深入分析C#中的“编写器”概念——代码修改、注解与重构

文章目录 1. 编写器&#xff08;Writer&#xff09;的概念2. 编写器的作用和工作原理3. 编写器的重要性4. 写入器常用方法5. 写入器示例6. 编写器示例——使用Fody进行代码注解和重构7. 总结 在软件开发过程中&#xff0c;代码的维护和更新是至关重要的。C#作为一种流行的编程语…

3.00001 postgres如何初始化系统参数?

文章目录 加载参数整体流程参数结构举例&#xff1a;ConfigureNamesBool 初始化参数 InitializeGUCOptionsbuild_guc_variablesInitializeOneGUCOptionInitializeGUCOptionsFromEnvironment 命令行添加SelectConfigFiles配置 加载参数整体流程 我们先看下guc参数是如何管理的。…

VUE3 学习笔记(6):data数据的监听、表单绑定、操作DOM

data数据的监听&#xff08;侦听&#xff09; 对于data的值的监听&#xff0c;可以用watch中与data中的参数命名一致的值做为函数进行获取监听变动前后的值再做逻辑判断&#xff0c;如下图所示。 示例代码 <template><div><p :class"classDemo">{…

七大获取免费https的方式

想要实现https访问最简单有效的的方法就是安装SSL证书。只要证书正常安装上以后&#xff0c;浏览器就不会出现网站不安全提示或者访问被拦截的情况。下面我来教大家怎么去获取免费的SSL证书&#xff0c;又如何安装证书实现https访问。 一、选择免费SSL证书提供商 有多家机构提…

C#数据类型变量、常量

一个变量只不过是一个供程序操作的存储区的名字。 在 C# 中&#xff0c;变量是用于存储和表示数据的标识符&#xff0c;在声明变量时&#xff0c;您需要指定变量的类型&#xff0c;并且可以选择性地为其分配一个初始值。 在 C# 中&#xff0c;每个变量都有一个特定的类型&…

windows驱动开发-PCI讨论(二)

认识PCI设备&#xff0c;还是要从配置空间说起&#xff0c;当PCI在ACPI和PCI复合体上电和枚举完成后&#xff0c;PCI根复合体会从PCI设备读出PCI设备的配置空间&#xff0c;许多信息(例如寄存器、内存空间、中断信息等等)都是是从配置空间获取的&#xff0c;所以接下来会详细讲…