当前位置:网站首页>Shell functions and arrays
Shell functions and arrays
2022-08-10 09:00:00 【Gigi Gigi Gigi Gigi】
目录
②精确的给每一个下表索引定义一个值加入数组,索引数字可以不连续
③先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
一、shell函数
1、函数的基本格式
[function] 函数名() {
命令序列
[return x] #使用return或exit可以显示的结束函数
}
或者
#也可以省略掉[function],它表示该函数的功能
函数名() { #函数名后面()是没有内容的
命令序列 #我们执行的命令内容放在{}里面
}
函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用.定义的时候哪怕出现语法错误也没关系,不调用就不会报错,当然我们写函数最终目的还是为了调用,为了实现某个功能块.
2、函数的返回值return
表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
函数一结束就取返回值,因为$?变量值返回执行的最后一条命令的退出状态码
退出状态码必须0~255,超出时值将为取余256(例如:返回码为300,那么将300%256)

3、函数的调用
直接在脚本里定义函数的代码块写函数名即可完成调用
①调用例子

②相同函数名的调用及两个函数里的变量调用
函数名必须是唯一的,如果先定义了一个,再用同样的名称定义第二个,那么第二个会覆盖第一个的功能,所以这里一定要注意不要重名
2个函数里同一个变量的值不一样,第二个变量值会覆盖第一个值


③函数调用顺序
调用函数之前,必须先进行定义!就是说函数的调用必须在函数的后面

4、函数的作用范围
在 Shell 脚本中函数的执行并不会开启一个新的子 shell,而是仅在当前定义的 shell 环境中有效.如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的.在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现.函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响.
shell脚本中变量默认全局有效
local命令:将变量限定在函数内部使用
函数内与函数外定义相同变量

hanshu2函数内部使用了local命令设置变量a,其作用是将变量a限定在函数内部,hanshu2函数外部同样定义了变量a,内部变量a和全局变量互不影响.脚本执行先调用了函数hanshu2,函数内部变量a为7,所以输出7,调完函数,变量a赋值为10,所以有输出10
5、函数的参数
在shell中,调用函数时可以向其传递参数,在函数体内部,通过$n的形式来获取参数值,例如,$1表示第一个参数,$2表示第二个参数,就是使用位置参数来实现参数传递.
①调用函数时传入2个参数

②用户输入2个参数

6、函数的递归调用
①使用递归计算阶乘

② 用for计算阶乘

7、函数库
简单的来说,就是在编辑一个脚本,其中定义多个函数,在通过其他脚本来使用.

二、shell的数组
数组是Shell的⼀种特殊变量,是⼀组数据的集合,⾥⾯的每个数据被称为⼀个数组元素.
当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制.数组中可以存放多个值.初始化时不需要定义数组大小(与 PHP 类似).与大部分编程语言类似,数组元素的下标由 0 开始.Shell 数组用括号来表示,元素用"空格"符号分割开.
1、数组的分类
普通数组:不需要声明直接定义,下标索引只能是整数
关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串
数组包括的数据类型: 数值类型 字符类型: 使用“ ” 或 ‘ ’ 定义
2、数组的定义
①直接把要加入数组的元素用小括号括起来,中间用空格分开
格式: 数组名=(value0 value1 value2)
例如:num=(10 20 30 40)
②精确的给每一个下表索引定义一个值加入数组,索引数字可以不连续
格式:数组名=([0]=value [1]=value [2]=value...)
例如:num=([0]=10 [1]=20 [2]=30 [3]=40)
③先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
格式: 变量= "value0 value1 value2 value3"
数组=($列表名)
例如:
list= "10 20 30 40"
num=($list)
④根据下表定义
格式: 数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
例如: num[0]="10" num[1]="20" num[2]="30"
3、数组的长度和元素
定义数组最简单的办法就是:a=(10 20 30 40)
读取数组中的全部长度使用:echo ${#a[*/@]}
读取数组中的下标对应的元素长度: echo ${#a[下标]}
读取数组中的全部内容使用:echo ${a[*/@]}
读取数组中的下标对应的元素内容: echo ${a[下标]}
①数组中所有元素及总数(长度)
数组长度可以通过 数组名[*] "或" 数组名[@]" 来 获取.
②根据下标获取数组元素的内容
根据下标获取数组中单个元素的长度
4、数组的遍历
使用for循环.遍历输出数组中的每一个元素

5、数组元素的切片(提取)
${a[*]:n:m} 提取从索引下标n开始的m个元素
${a[*]:n} 提取从索引下标n开始的所有元素
${ !a[*]} 查看数组有哪些下标
6、数组元素的临时替换
${a[*]/n/m} 将a数组中的元素中有n字符串的替换为m字符串,如果一个元素有多个n字符串只替换一次
7、数组的删除
a=(45 10 100 1000 20 30)
unset a //删除数组
a=(45 10 100 1000 20 30)
unset a[3] //删除数组a第3个元素
三、冒泡排序
类似气泡上涌的动作,会将数据的数组从小到大或者从大到小不断的向前移动
基本思想
冒泡排序的基本思想就是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部.
算法思路
冒泡算法有双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组,不需要对比,同时数组已经完成排序了.而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少
四、总结
函数
函数的作用: 就是实现一个功能块,然后进行调用,函数名不能重复
函数中可以使用return进行返回一个状态码 ,可以根据状态码查看函数的运行效果
函数中定义变量,可以使用local关键字进行定义成局部变量 ,局部变量只能在函数中使用,不会与shell环境中的其它相同变量名冲突
函数的参数可以使用位置参数进行传参 ,在调用时可以直接输入位置参数的值.也可以调用时再定义位置变量,然后通过获取用户输入的值来传给函数中的变量.
数组
数组的定义方式有多种, 最常见的就是函数名=(元素1 元素2 元素3)
查看数组的长度: ${#数组名[*或@]},查看函数的元素内容: ${数组名[*或@]}
数组中元素的赋值,最常用的赋值为: 数组名[下标]=元素值
数组的切片:切片的意思就是将数组元素内容按照设定的内容进行输出
格式:echo ${数组名[*]:下标:需要打印的几个元素值}
echo ${a[0]}
例如:将数组内容的第二个元素开始的3个元素输出
echo ${num[*]:1:3}
数组的替换:只是在输出的时候进行替换 (注意:在替换的时候,它找到内容是数组元素中的内容)
格式:echo ${a[*]/匹配的内容/替换后的内容} (仅替换每个元素的第一个匹配项)
例如:将输入中的内容3换成10
echo ${num[*]/3/10}
边栏推荐
猜你喜欢

shell遍历文件夹并输出

【Unity入门计划】2D游戏实现敌人来回移动控制脚本
![[OAuth2] Nineteen, OpenID Connect dynamic client registration](/img/01/2f318a06e130cc222aa1736abbd152.png)
[OAuth2] Nineteen, OpenID Connect dynamic client registration

DeepFake换脸诈骗怎么破?让他侧个身

高性能短连接设计

iwemeta metaverse: a doll sells for 9999 yuan, and Bubble Mart thinks it is not expensive at all

微信小程序--》小程序生命周期和WXS使用
![[Metaverse Omi Says] See how UCOUCO integrates performance art into the Metaverse](/img/2e/75e52bb202ae260daf23f44fa0d3e6.png)
[Metaverse Omi Says] See how UCOUCO integrates performance art into the Metaverse
深度剖析“八大排序”(上)_ 探寻一些不为人知的细节

速卖通卖家如何抓住产品搜索权重
随机推荐
FPGA时钟篇(三) MRCC和SRCC的区别
Day36 LeetCode
【元宇宙欧米说】看UCOUCO如何将行为艺术融入元宇宙
iwemeta metaverse: a doll sells for 9999 yuan, and Bubble Mart thinks it is not expensive at all
差分、前缀和模板
The implementation of the seemingly useless component (text gradient) in NaiveUI is so simple
怎么使用【jmeter正则表达式提取器】解决返回值作参数的问题
对称加密与非对称加密的区别
封装和使用通用的工具栏组件
CAD转WPF: 关于CAD图纸文件转换为WPF矢量代码文件(xaml文件)的技巧
线程池的基本概念、结构、类
Rust learning: 6.5_Array of composite types
Guys, may I ask, the oraclecdc error report is not serialized, but I see that the source code does not inherit serialization, what is the reason?
I don't want to do accounting anymore, Die changed to a new one, moved forward bravely, and finally successfully passed the career change test to double his monthly salary~
BUUCTF【pwn】解题记录(4-6页持续更新中)
J9数字论:Web3.0+互联网电商会引起怎样的火花?
Hugo NexT主题升级记录
FPGA时钟篇(一) 7系列的时钟结构
LaTeX出现错误代码Command \algorithmic already defined
Question brushing tool h