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"即可调试中间的脚本。

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

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

相关文章

【经验分享】可视化的项目管理,轻松解决资源冲突和协作困难

在数字化时代,高效协同逐步成为提升组织效能的重要着力点,同时也是企业保持竞争力、实现持续发展的关键要素。一方面可以打破部门壁垒,促进信息流通,从而提升整体工作效率;另一方面还能帮助企业优化资源配置和管理流程…

快团团帮卖团长怎么对供货大团长进行评分?

都说帮卖“躺赚”? 一旦遇团不淑,惨遭不靠谱团长挖坑,售后拖延、发货慢、产品瑕疵…… 加上顾客夺命连环催,双面夹击,夹缝生存。供货团长靠不靠谱太重要了! 快团团供货团长评分系统上线! 帮卖团…

什么是erp仓储管理系统?ERP系统的价值体现在哪些方面?

ERP仓储管理系统是一个帮助企业管理仓库的工具。想象一下,如果你是一个仓库管理员,里面堆满了各种各样的产品和货物,如何确保这些产品数量准确、摆放有序,以及快速找到自己需要的产品呢? 这时,如果企业引用…

GitLab项目中添加用户,并设置其角色权限等

注意:创建用户(new user),创建完用户然后再项目邀请用户,选择创建过的用户 一、以管理员身份登录GitLab的WebUI并创建用户 1>.使用管理员登录GitLab 使用管理员(root)用户登录成功后,点击如下图所示的小扳手,点击…

NameSilo + Cloudflare 给网站加个域名(附 NameSilo 购买域名优惠码)

网站做好了之后,下一步就是买域名 在国内买域名的话,还需要备案,个人名下备案好像是还有限制,我就去 NameSilo 上面买的 在买之前,对比过几家 比如: godaddy/namecheap/cloudflare 本来是倾向于在 godaddy 上面买的,因为它支持支付宝支付,但是在详细看的时候,发现如果购买一年…

CLIP 源码分析:simple_tokenizer.py

tokenizer的含义 from .clip import *引入头文件时为什么有个. 正文 import gzip import html import os from functools import lru_cacheimport ftfy import regex as re# 上面的都是头文件# 这段代码定义了一个函数 default_bpe(),它使用了装饰器 lru_cache()。…

vue 笔记02

目录 01 事件修饰符 02 按键修饰符 03 v-bind属性 04 vue-axios的基本使用 05 vue的生命周期 06 vue生命周期涉及到的其他的知识点 01 事件修饰符 vue的事件修饰符 事件名称.修饰符1.修饰符2...事件驱动函数 stop 阻止冒泡修饰符 prevent 阻止默认行为 once 当前事件只触…

嵌入式学习记录5.18(多点通信)

一、套接字属性设置相关函数 #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);int setsockopt(int sockfd, int level, int optname,const void *op…

vue3学习(三)

前言 继续接上一篇笔记&#xff0c;继续学习的vue的组件化知识&#xff0c;可能需要分2个小节记录。前端大佬请忽略&#xff0c;也可以留下大家的鼓励&#xff0c;感恩&#xff01; 一、理解组件化 二、组件化知识 1、先上知识点&#xff1a; 2、示例代码 App.vue (主页面) …

人类和小鼠转录组上游分析

基础软件 conda install cutadapt, trimmomatic, samtools, hisat2, subread, deeptools -y人类转录组上游分析 # 样本名称 sample_namesample# 线程 threads4# 双端测序原始fastq1和fastq2路径 fastq1_path/path/${sample_name}_1.fq.gz fastq2_path/path/${sample_name}_2.…

SRS视频服务器应用研究

1.SRS尝试从源码编译启动 1.1.安装ubuntu 下载镜像文件 使用VMWare安装&#xff0c;过程中出现蓝屏&#xff0c;后将VM的软件版本从15.5升级到17&#xff0c;就正常了。

WPS PPT学习笔记 2 结构页的制作

制作PPT结构页 制作封面页、目录页、封底页。它们都属于结构页。而时间轴页&#xff0c;流程图页&#xff0c;框架图页这些属于内容页。 做一份PPT 讲一个故事 封面页 开头&#xff0c; 目录页 脉络&#xff0c; 各式内容页 详情&#xff0c; 封底页 结尾。 所有的结构页…

Linux系统编程学习笔记

1 前言 1.1 环境 平台&#xff1a;uabntu20.04 工具&#xff1a;vim,gcc,make 1.2 GCC Linux系统下的GCC&#xff08;GNU Compiler Collection&#xff09;是GNU推出的功能强大、性能优越的多平台编译器&#xff0c;是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执…

【自用题库】2024/华三/H3CNE安全GB0-510

【网工必备】华三H3CNE-安全-510 题库覆盖百分百&#xff0c;题库有291道总结汇总 还有vce加vce文件模拟真实考试环境 到手文件夹5样东西&#xff01;&#xff01;&#xff01; 认证简介&#xff1a;H3CNE-Security&#xff08;H3C Certified Network Engineer For Security&am…

Dubbo生态之深度分析sentinel的流量控制

1. 深度了解sentinel限流规则参数的含义 博客Dubbo生态之sentinel限流-CSDN博客中有dubbo集成sentinel的demo演示 在sentinel中&#xff0c;限流的直接表现形式就是&#xff0c;在执行Entry nodeA SphU.entry(resourceName)的时候抛出FlowException异常&#xff0c;FlowExce…

Octo:伯克利开源机器人开发框架

【摘要】在各种机器人数据集上预先训练的大型策略有可能改变机器人学习&#xff1a;这种通用机器人策略无需从头开始训练新策略&#xff0c;只需使用少量领域内数据即可进行微调&#xff0c;但具有广泛的泛化能力。然而&#xff0c;为了广泛应用于各种机器人学习场景、环境和任…

OpenCV学习 基础图像操作(十四):直方图均衡化和直方图规定化

基础原理 直方图操作是基于像素统计的基础图像操作,被广泛运用于调整图像的对比度,并由此衍生出很多变种和该经的方式. 图像相直方图 直方图(Histogram)&#xff0c;又称质量分布图&#xff0c;是一种统计报告图&#xff0c;由一系列高度不等的纵向条纹或线段表示数据分布的…

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

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

用大模型搭建一个自己的新闻小助手

背景 信息快速增长的时代&#xff0c;及时获取到有价值的资讯是一件很必要的事情。已经有各类新闻app和获取信息的渠道了&#xff0c;为什么还需要在构建一个小助手来获取新闻资讯呢&#xff1f;其实原因很简单各类新闻app服务的是具体一类人群&#xff0c;个人和人群还是有偏…

【leetcode 203】 移除链表元素

题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&…