shell 脚本的函数和数组

news2024/9/23 17:15:26

函数

—— 封装的一个公式:sin、cos、tan

—— 函数为脚本的别名

—— 函数就是一个功能模块,在函数中写执行的命令即可;使用函数可以避免代码重复,增加可读性,简化脚本,使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强

—— 函数由函数名和函数体组成

—— 函数一定要先定义,才能使用

—— 帮助:help function

函数的用法

注:一定要先给函数定义,才能执行函数

查看函数
declare 命令

—— declare -F :查看函数列表

—— declare -f __函数名 :查找指定函数名;两个下划线

函数的定义

—— 格式1:自定义函数名 () {

脚本;命令序列

}

—— 格式2:function 自定义函数名 {

脚本;命令序列

}

—— 格式3:function 自定义函数名 (){

脚本;命令序列

}

例
格式1    #一般用此格式
[root@localhost opt]# han () { echo "hello"; }
#定义一个函数 han 为标准输出 hello
[root@localhost opt]# han
hello    #执行此函数,显示结果

格式2
[root@localhost opt]# function han { echo "hello"; }
[root@localhost opt]# han
hello

格式3
[root@localhost opt]# function han () { echo "hello"; }
[root@localhost opt]# han
hello

删除函数
unset 命令

—— unset 函数名

例
#先定义一个函数,并验证是否能使用
[root@localhost opt]# han () { echo "hello"; }
[root@localhost opt]# han
hello

[root@localhost opt]# unset han      #删除函数
[root@localhost opt]# han
bash: han: 未找到命令...
#再次使用函数,验证是否删除;删除成功

定义函数变量的作用范围

local

—— 加此关键词,可以固定函数的变量范围,使其只能在函数内运行

export

—— 让子shell 继承变量


例
[root@localhost opt]# name=吴彦祖       #定义一个变量name为吴彦祖
[root@localhost opt]# echo $name       #验证
吴彦祖
[root@localhost opt]# id () { name=彭于晏;echo $name; }
#定义一个函数id,让其中变量name输出结果为彭于晏
[root@localhost opt]# id               #验证
彭于晏
[root@localhost opt]# echo $name
彭于晏
 #此时输出变量name已经被函数id所影响
[root@localhost opt]# unset id
[root@localhost opt]# echo $name
彭于晏
#就算删除函数id,变量name已经被更改
[root@localhost opt]# name=吴彦祖        #重新定义name
[root@localhost opt]# echo $name        #验证
吴彦祖
[root@localhost opt]# id () { local name=彭于晏;echo $name; }
#使用命令 local,限制变量参数,使其只能在函数中执行
[root@localhost opt]# id                #验证
彭于晏
[root@localhost opt]# echo $name        #验证,此时变量name不会被函数id影响
吴彦祖

函数的返回值

return

—— 自定义 返回值 0 -- 255

—— 如果使用函数,那么 $? 那么使用就会受限,可以使用 return 自定义 $? 的返回值,来判断函数中的命令是否成功

—— 函数一结束就取返回值,因为 $? 变量只返回执行的最后一条命令的退出返回码

—— 退出码必须是0-255,超出的值将为除以256取余

例
[root@localhost opt]# text () { echo "hello"; }
#定义一个函数
[root@localhost opt]# text
hello
[root@localhost opt]# echo $?
0
#此时返回值为0
[root@localhost opt]# text () { echo "hello";return 250; }
#更改返回值为250
[root@localhost opt]# text
hello
[root@localhost opt]# echo $?
250
#此时返回值已经被更改为250

函数的传递参

脚本
#!/bin/bash
sum () {
echo " $1 "     #识别第一个字符串
echo " $2 "     #识别第二个字符串
#识别两个字符串
}
sum $2 $1
#这后面的$2和$1,代表的是跟在脚本后面的字符串的顺序;此处就是设定将第二个字符串放在第一位,将第一个字符串放在第二位

显示结果
[root@localhost opt]# bash j.sh 1 9
 9 
 1 

需要注意

—— 脚本的 $1 $2 和函数的 $1 $2 ,是没有关系的

—— 函数的 $1 $2 是指跟在函数后面的值

递归函数

—— 函数的本质就是一个程序,每开一个进程都会消耗资源,无限的开自己死循环就会造成资源的无限占用形成病毒

—— 函数调用自己本身的函数

—— 必须要有结束函数的语句,防止死循环

阶乘函数

—— 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0和1的阶乘为1,自然数n的

—— 阶乘写作 n! =1×2×3×...×n

—— 阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n n!=n(n-1)(n-2)...1 n(n-1)! = n(n-1)(n-2)!

脚本举例:此脚本作用是计算任意数值的阶乘
#!/bin/bash
fact () {
if [ $1 -eq 0  -o  $1 -eq 1 ]
then
   echo 1
else
   echo $[$1* $(fact $[$1-1])]
#这里将 $[$1-1] 的值再次使用函数 fact 进行执行
#此处 * 为乘
fi
}
fact $1

结果展示
[root@localhost opt]# bash digui.sh 5
120
#5的阶乘为120

函数的文件

—— 专门存放函数的文件

—— . 绝对路径的文件名 函数名:从存放函数的文件中,提取使用指定函数(. 可以用 source 代替)


数组

—— 数据的集合称为数组

  • 普通数组,普通数组可以不事先声明,直接使用;下标只能是数值

  • 关联数组,关联数组必须先声明,再使用;下标可以自定义任意字符串

  • 变量:存储单个元素的内存空间

  • 数组:存储多个元素的连续的内存空间,相当于多个变量的集合

—— 数组名和索引

  • 索引的编号从0开始,属于数值索引

  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持

  • bash的数组支持稀疏格式(索引不连续)

数组的使用

—— 一定要先声明数组

daclare -a 普通数组(不需要手动声明,系统帮你声明了)

—— 关联数组一定要手动声明

declare -A 数组名

定义数组

—— 自定义数组名=(数组值中间用空格隔开)

单个调用
echo作用
${a[0]}调用第一个值
${a[1]}调用第二个值
${a[2]}调用第三个值
…………
${a[n]}调用第n个值
全部调用
echo作用
${a[@]} 或者 ${a[*]}显示所有结果
${#a[@]} 或者 ${#a[*]}统计个数
${!a[@]} 或者 ${!a[*]}显示所有下标

数组切片

—— 格式:echo ${自定义数组名[@或*]:自定义数字:自定义数字}

—— 注意:以 “:” 为分隔符

例
[root@localhost opt]# a=(1 2 3 4 5)
[root@localhost opt]# echo ${a[@]:1:3}
2 3 4
#从第一个开始并跳过第一个,到后三个结束

数组替换

—— 格式:echo ${自定义数组名[@或*]/查找的目标字符/替换的字符}

—— 注意:以 “/” 为分隔符

例
[root@localhost opt]# a=(1 2 3 4 5)
[root@localhost opt]# echo ${a[@]/2/hi}
1 hi 3 4 5
#查找a数组中第二个字符串,并替换成hi

数组删除

—— 格式:unset 数组名 //删除该数组

—— 格式:unset 数组名[n] //选择数组中的第 n 个删除;从0开始,0代表第一个字符

例
[root@localhost opt]# a=(1 2 3 4 5)
[root@localhost opt]# echo ${a[*]}
1 2 3 4 5
[root@localhost opt]# unset a[2]            #删除该数组中第三个字符   
[root@localhost opt]# echo ${a[*]}          #验证 
1 2 4 5
[root@localhost opt]# unset a               #删除该数组
[root@localhost opt]# echo ${a[*]}
#不会显示任何东西

冒泡排序

—— 一种数组排序算法

—— 类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动

—— 基本思想:冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部

—— 算法思路:冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了,而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少

脚本举例:此脚本是随机生成十个不同的数字并进行从小到大排序
#!/bin/bash
for  i  in {0..9}
do
a[$i]=$RANDOM
done
#生成一个拥有十个随机数的数组
echo "原始数组: ${a[@]}"

l=${#a[@]}
#定义变量l 等同于数组的总个数;此处 l=10
for((i=1;i<$l;i++))
#需要进行比较的次数
do
   for ((j=0;j<$l-$i;j++))
   #相邻的数字,需要比较的次数
   do
   first=${a[$j]}
   #数组的第 n个数
   k=$[$j+1]
   #数组的 n+1大小的下标
   second=${a[$k]}
   #数组的第 n+1个数
   if [ $first  -gt  $second ]
   then
   temp=$first
   a[$j]=$second
   a[$k]=$temp
   #该三行是将两个数字进行更换位置
   fi
   done
done

echo "从小到大:  ${a[@]}" 

脚本举例

比较随机数字的数组大小
#!/bin/bash
for a in {0..9}
do
   b[$a]=$RANDOM
   [ $a -eq 0 ] && min=${b[0]} && max=${b[0]}
   [ ${b[$a]} -gt $max ] && max=${b[$a]}
   [ ${b[$a]} -lt $min ] && min=${b[$a]}
done

echo "数组: ${b[*]}"
echo "最大值: $max"
echo "最小值: $min"

补充命令

scp 脚本名 目标ip

—— 将脚本发送给指定虚拟机

declare 命令补充

—— declare +/- 选项 变量名

选项作用
-赋予变量类型属性
+取消变量的类型属性
-a将变量声明为数组型
-i将变量声明为整数型
-x将变量声明为环境变量
-r将变量声明为只读变量
-p查看变量的被声明的类型

eval 命令

—— 格式:eval()

—— 注释:将任意字符串当成有效的表达式来求值并返回计算结果;如果参数不是字符串类型,则直接返回参数;需要注意的是,使用 eval() 函数时需要谨慎,因为它可以执行任意代码,存在一定的安全风险

显示颜色的命令

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

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

相关文章

【C++初阶】STL详解(六)Stack与Queue的介绍与使用

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

UE5 中的computer shader使用

转载&#xff1a;UE5 中的computer shader使用 - 知乎 (zhihu.com) 目标 通过蓝图输入参数&#xff0c;经过Compture Shader做矩阵运算 流程 1. 新建插件 2. 插件设置 3. 声明和GPU内存对齐的参数结构 4. 声明Compture Shader结构 5. 参数绑定 6. 着色器实现 7. 分配 work gr…

【Spring】 IoCDI

回顾 企业命名规范 大驼峰:BookDao(首字母都大写) 类名 小驼峰:bookDao(第一个字母小写) 方法名 蛇形:book_dao(小写下划线_) 数据库 串形:book-dao(小写连字符-) 项目文件夹 各种注解 学习Spring MVC, 其实就是学习各种Web开发需要⽤的到注解 a. RequestMapping: 路由…

计算机中文编程工具构件之透明按钮,编程工具下载,零基础自学编程

计算机中文编程工具构件之透明按钮&#xff0c;编程工具下载&#xff0c;零基础自学编程 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&am…

HashML——让更多企业读懂数据,用好AI

随着大模型技术的兴起&#xff0c;数据智能和AI正成为企业数字化转型的新驱动力。 酷克数据研发推出的新一代高级分析和数据科学工具箱HashML自推出以来&#xff0c;受到了众多企业和技术爱好者的广泛关注。在最近的直播中&#xff0c;我们邀请了HashData的数据科学工程师&…

目标检测算法 - YOLOv3

文章目录 1. Backbone Darknet-532. 整体架构3. 损失函数4. 训练过程5. 预测过程 YOLOv1、YOLOv2都是在CVPR这种正规的计算机视觉学术会议上发表的正式学术论文。 YOLOv3不算一篇严谨的学术论文&#xff0c;是作者随笔写的技术报告。 YOLOv3性能&#xff1a; 1. Backbone Dark…

七要素微气象仪气象数据监测助手

WX-WQX7 随着科技的发展&#xff0c;气象预测的准确性已成为人们日常生活的重要参考。而七要素微气象仪&#xff0c;作为新型的气象探测设备&#xff0c;以其精细化的数据测量和解析能力&#xff0c;正在改变我们的天气预测方式。 一、产品介绍 七要素微气象仪是一款集成了温…

STM32:基本定时器原理和定时程序

一、初识定时器TIM 定时器就是计数器&#xff0c;定时器的作用就是设置一个时间&#xff0c;然后时间到后就会通过中断等方式通知STM32执行某些程序。定时器除了可以实现普通的定时功能&#xff0c;还可以实现捕获脉冲宽度&#xff0c;计算PWM占空比&#xff0c;输出PWM波形&am…

TEMU平台商品欧盟站要求电子和电气产品提供CE-EMC(Electric)资质

CE-EMC认证是欧盟对于市场上销售的电子和电气产品所要求的一个重要认证标准。该认证指令规定了产品在电磁环境下的辐射和抗干扰性能要求&#xff0c;以确保产品在使用时不会对其他设备和系统产生干扰&#xff0c;并且能够正常工作&#xff0c;不受其他设备的干扰。 CE EMC认证…

【机器学习 | 白噪声检验】检验模型学习成果 检验平稳性最佳实践,确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

flink和机器学习模型的常用组合方式

背景 flink是一个低延迟高吞吐的系统&#xff0c;每秒处理的数据量高达数百万&#xff0c;而机器模型一般比较笨重&#xff0c;虽然功能强大&#xff0c;但是qps一般都比较低&#xff0c;日常工作中&#xff0c;我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…

【Mysql学习笔记】3 - 本章作业

1.判断 1. 这句话表示ename as name 可以不要这个as&#xff0c;同理后面的sal salary也是别名&#xff0c;而选项D的Annual Salary中间也有空格&#xff0c;程序会判断为as 但as不能连用&#xff0c;所以错误&#xff0c;选D 2.选B&#xff0c;因为null不能加上判断符号<&…

shell(函数和数组)

目录 一、函数 1.函数的由来 2.函数的作用 3.函数的使用方法 4.函数的定义 5.查看函数 6.删除函数 7.函数返回值 8.函数的传参数 9.函数递归 二、数组 1.数组的相关介绍 2.声明数组 3.定义数组的格式 4.冒泡排序 总结&#xff1a;本章主要介绍了函数和数组相关知…

Redis集群主备切换原因排查

背景 线上redis部署的是三主三集群&#xff0c;昨天中午&#xff0c;线上各服务接连告警&#xff0c;提示服务已下线&#xff0c;过一段时间又上线了&#xff08;springboot-admin企业微信服务下线、上线告警&#xff09;&#xff0c;赶紧放下手中外卖排查。 排查 1. 查看各…

unreal 指定windows SDK

路径 &#xff1a; “C:\Users\Administrator\AppData\Roaming\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml” 在Configuration中添加 <WindowsPlatform><WindowsSdkVersion>10.0.20348.0</WindowsSdkVersion></WindowsPlatform>示例&…

什么是高防IP?如何进行防护?怎样隐藏源站?

高防IP是针对互联网服务器遭受大流量的DDoS攻击后导致服务不可用的情况下&#xff0c;推出的付费增值服务&#xff0c;是目前最常用的一种防御DDoS攻击的手段。用户在数据不转移的情况下&#xff0c;就可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;防护系…

objdump反汇编文件解析

命令使用 objdump可以对可执行文件进行反汇编 其常用参数为: objdump -d <file(s)>: 将代码段反汇编&#xff1b;objdump -S <file(s)>: 将代码段反汇编的同时&#xff0c;将反汇编代码与源代码交替显示&#xff0c;编译时需要使用-g参数&#xff0c;即需要调试信…

R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析

很久很久以前给大家写过决策树&#xff0c;非常简单明了的算法。今天给大家写随机&#xff08;生存&#xff09;森林&#xff0c;随机森林是集成了很多个决策数的集成模型。像随机森林这样将很多个基本学习器集合起来形成一个更加强大的学习器的这么一种集成思想还是非常好的。…

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SCN随机配置网络多变量回归预测 1.data为数据集&#xff0c;7个输入特征&#xff0…

二十、索引库

目录 一、Mapping属性 二、创建索引库 1、在DevTools中编写代码 2、运行并查看 三、查询索引库 1、查询索引库语法&#xff1a; 四、删除索引库 1、删除索引库语法 五、修改索引库 一、Mapping属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括:…