【shell】函数和数组的原理及使用注意

news2024/9/21 12:44:11

目录

一、函数

1.1函数的优点:

1.2如何定义函数(shell)

1.3 演示函数的作用以及增删改查

关于函数的使用

关于declare查询的用法 

关于函数的增加与调用

关于函数的返回值return 

 关于echo作为返回

关于函数的参数传递

关于函数的环境变量和内置变量:local

关于函数的位置与调用

递归函数 

二、数组

2.1数组的分类

2.2定义数组

2.3调用数组以及给数组赋值

 ##获取数组长度

##获取数组的所有信息 

##读取下标的标号有哪些 

##数组切片 

##给某个数组原有的值重新赋值 

 ##取出数组中的最大值和最小值

##永久修改数组,批量修改数组内容

##删除数组


一、函数

1.1函数的优点:

函数可以理解为脚本的别名,使用函数可以避免代码错误,增强可读性,简化脚本;函数可以将大的工程来分割为若干小的功能模块,代码的可读性更强;

我个人目前认为,没有感受到shell脚本使用函数的简化,但是能明显感受增强了shell脚本的模块化,因为函数与函数之间没有关联,调用的时候更加方便,这样对于写脚本来说,可以让脚本的功能更加强大。

1.2如何定义函数(shell)

##第一种:简单常用
函数名(){
脚本(命令集合)
}

##第二种:
function 函数名{
脚本内容(命令集合)
}

##第三种
函数名(){
脚本(命令集合)
}

1.3 演示函数的作用以及增删改查

关于函数的使用

#!/bin/bash
num(){   ##num是定义的函数名称
a=66
echo ${a}
}

num  ##这里的num是调用上面的num函数脚本

关于declare查询的用法 

【查看函数列表】
declare -F
#查看当前已定义的函数名,仅仅显示名称

declare -f
#查看当前已定义的函数定义,包含脚本代码

declare -f 函数名称
#查看该函数是否存在(这里必须是已经用source或者.已经声明过的函数内容,要不然系统无法识别)

declare -F 函数名称
#查看当前已定义的函数,以及详细代码

unset 函数名
#表明从系统中删除定义的函数,但是如果函数脚本使用source再次声明,还是会存在的

关于函数的增加与调用

关于函数的返回值return 

return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值,使用原则:

1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
2. 退出码必须是0-255,超出的值将为除以256取余

第一个知识点:要知道函数中的return跟调用时$?一起搭配使用,这样return才有意义

第二个知识点:return返回值是不能大于255,要不然就是除以256取余 

 第三个知识点:return在使用的时候注意,但在执行完脚本后用于给与返回值,否则会直接退出

 关于echo作为返回

个人理解是:如果说return不能很好使用的时候,可以使用echo来输出对于命令执行的判断,这样更方便,没有例子更好的去感受

关于函数的参数传递

脚本中写的$1、$2等位置变量是调用函数的时候跟上的值

调用函数的时候的位置变量是使用bash调用脚本的时候的位置变量

关于函数的环境变量和内置变量:local

local值

关于函数的位置与调用

一定要先有函数的定义,然后再调用函数,否则不生效

递归函数 

递归函数就是调用自身的函数,注意:必须要有结束函数的语句,要不然就会死循环

实验查看下一篇博客

常见的fork炸弹都是递归函数,已知不停调用自己,没有跳出循环的条件

:(){:|:&};:
个人的理解:这里的:可以是一个字符或其他字符串,相当于定义了一个函数叫做:,执行:并且将内容传给:自己,再并行操作,分号表示接下来执行这个动作的分隔符,最后的:为调用执行这个函数

bomb(){ bomb|bomb & };bomb  ##这就是将冒号换成了bomb

总结:关于函数的使用,可以准备一个函数的总的脚本,然后准备一个工具箱,整体调用,但是一定要把函数脚本放在工具箱脚本的最最最开头!(实操后补博客)

二、数组

2.1数组的分类

第一种:普通数组

下标索引是从0开始的数字,下标数字是可以不连续的

普通数组是系统会自动进行声明的,

第二种:关联数组

一定一定要使用declare -A 数据名称进行声明

declare -a 可以查看所有的普通数组;

declare -A 可以查看所有的关联数组 ;

拓展:也可以以文件名来定义数组

[root@host1 /data]#ls
a.sh  chmod.sh  compare.sh  f.sh  name.txt  num.sh  test2.sh  yum.sh
[root@host1 /data]#file=(*.sh)
[root@host1 /data]#echo ${file[*]}
a.sh chmod.sh compare.sh f.sh num.sh test2.sh yum.sh

[root@host1 /data]#echo ${num[*]}

[root@host1 /data]#num=`echo {1..10}`
[root@host1 /data]#echo ${num[*]}
1 2 3 4 5 6 7 8 9 10
[root@host1 /data]#echo ${xx[*]}

[root@host1 /data]#i=10
[root@host1 /data]#xx=`eval echo {1..$i}`
[root@host1 /data]#echo ${xx[*]}
1 2 3 4 5 6 7 8 9 10

2.2定义数组

方法有5种,常用的是这两种

1、总体赋值

2、单个赋值

[root@host1 /data]#a=(a b c d e f g)
[root@host1 /data]#echo ${a[*]}
a b c d e f g

[root@host1 /data]#n[0]=zhangsan
[root@host1 /data]#n[1]=lisi
[root@host1 /data]#n[2]=wangwu
[root@host1 /data]#n[3]=liliu
[root@host1 /data]#echo ${n[*]}
zhangsan lisi wangwu liliu

2.3调用数组以及给数组赋值

 ##获取数组长度

##获取数组长度
[root@host1 /data]#echo ${#a[*]}  ##echo ${#数组名[*]}
7
[root@host1 /data]#echo ${#a[@]}  ##echo ${#数组名[@]}
7

##获取数组的所有信息 

##获取数组的所有信息
[root@host1 /data]#echo ${a[*]}   ##echo ${数组名[*]}
a b c d e f g
[root@host1 /data]#echo ${a[@]}   ##echo ${数组名[@]}
a b c d e f g

##读取下标的标号有哪些 

##读取下标的标号有哪些
[root@host1 /data]#echo ${!a[*]}   ##echo ${!数组名[*]}
0 1 2 3 4 5 6

##数组切片 

##数组切片
[root@host1 /data]#echo ${a[@]:2}  ##echo ${数组名[@]:n:m}表示跳过前n个,只看m个,如果没有m则是后面所有
c d e f g
[root@host1 /data]#echo ${a[@]:2:2} ##跳过前2个,看后面2个
c d
[root@host1 /data]#echo ${a[@]:2:3} ##跳过前2个,看后面3个
c d e
[root@host1 /data]#echo ${a[@]}  ##对比查看学习
a b c d e f g

##给某个数组原有的值重新赋值 

##给某个数组原有的值重新赋值
数组名[标号]=新的值  

 ##取出数组中的最大值和最小值

#!/bin/bash
for i in {0..6}      ##这里是表明有7个随机数,也可以用read交互的办法来写
do
num[$i]=$[RANDOM]    ##表示随机给数组num赋值
[[ $i -eq 0 ]] && min=${num[0]}&&max=${num[0]}  ##当有第一个数组时,最大值和最小都是它
[[ ${num[$i]} -gt ${max} ]]&& max=${num[$i]}    ##表示随机产生的数字与最大值比较,如果大成立,则执行将其值赋给max
[[ ${num[$i]} -lt ${min} ]]&& min=${num[$i]}    ##表示随机产生的数字与最小值比较,如果小成立,则执行将其值赋给min
done
echo "所有的随机数为:${num[@]}"
echo "最大值为:${max}"
echo "最小值为:${min}"

 

##永久修改数组,批量修改数组内容

 首先学习临时修改:

永久修改的思路

其实没有永久修改的办法,只能思考,定义一个新的数组,过度一下,将改过的赋给新的数组,然后再把旧的数组删除了,把新的数组再传给 旧的数组名

##删除数组

##删除数组
unset  数组名称

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

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

相关文章

前端编码技巧须知

前端开发中可能会使用到以下软件,它们各自具有不同的作用: 代码编辑器:例如Sublime Text、Atom、Visual Studio Code等,用于编写和编辑HTML、CSS和JavaScript等前端代码。网页浏览器:例如Chrome、Firefox、Safari等&a…

【C++】C++入门(下)——有C语言基础的C++学习

C入门(下) 一、引用1.引用的概念2.引用的定义3.引用特性4.常引用5.使用场景做参数做返回值 6.引用的作用7.引用与指针的区别 二、内联函数1.概念2.特性 三、auto关键字(C11)1.简介2.auto的使用细则auto与指针和引用结合起来使用在…

python appiumn 自动化测试 入门

资源下载 链接:https://pan.baidu.com/s/1zl1yXYna73RAL-V0PQ9xHA 提取码:syjg 安装JDK 不详细说了 配置Android SDK 新建 ANDROID_HOME配置对应的SDK路径 新增PATH 安装python库 pip install Appium-Python-Client报如图错误的话可以使用 pytho…

搭建FTP

第一步:按【Win R】快捷键打开运行对话框,输入“optionalfeatures”后,按回车键 第二步:从“启用或关闭Windows功能”弹窗中找到Internet Information Services(或者中文版Internet信息服务)并打开,配置IIS并点击确…

单片机语音芯片开发要解决的问题

在单片机语音芯片开发过程中,可能会遇到多种问题,这些问题可能来自于技术层面,也可能来自于芯片本身的设计和应用层面。下面让我们具体从芯片的功耗、语音识别的准度、芯片的尺寸和芯片的可靠性四个方面开展讨论。 1.芯片的功耗问题 首先&a…

motionlayout的简单使用

MotionLayout 什么是motionLayout? MotionLayout 是 Android 中的一个强大工具,用于创建复杂的布局动画和过渡效果。它是 ConstraintLayout 的一个子类,继承了 ConstraintLayout 的布局功能,同时添加了动画和过渡的支持。Motion…

Java字节码指令集概述及分类详解

Java全能学习面试指南:https://javaxiaobear.cn 1、字节码指令集与解析概述 Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。 Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码&a…

Redis并发问题解决方案

目录 前言 1.分布式锁 1.基于单个节点 2.基于多个节点 3.watch(乐观锁) 2.原子操作 1.单命令操作 2.Lua 脚本(多命令操作) 3.事务 1.执行步骤 2.错误处理 3.崩溃处理 总结 前言 在多个客户端并发访问Redis的时候,虽然Redis是单线程执行指令&#xff…

Banana Pi [BPi-R3-Mini] 回顾和主线 ImmortalWrt 固件支持

BananaPi BPi-R3 Mini 采用 MediaTek 830(4 个 A53,最高 2.0 GHz),具有 2 个 2.5 GbE、AX4200 2.4G/5G 无线和 USB 2.0 端口。它还具有两个 M.2 连接器,可用于 NVMe SSD 和 5G 模块(板上包含 Nano SIM 插槽…

绝地求生:PGC 2023 赛事直播期间最高可获:2000万G-Coins,你还不来吗?

今年PGC直播期间将有最高2000万G-Coin掉落,究竟花落谁家咱们拭目以待 公告原文:Watch PGC 2023 Live And Earn G-Coins! 如何赚取高额G-Coin? Throughout the PGC 2023, an astounding 20,000,000 G-Coins will be up for grabs as part of …

常见树种(贵州省):013桉树、米槠、栲类

摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、桉树 …

京东数据分析(京东大数据):2023年10月京东手机行业品牌销售排行榜

鲸参谋监测的京东平台10月份手机市场销售数据已出炉! 根据鲸参谋平台的数据显示,今年10月份,京东平台手机行业的销量约340万,环比增长约11%,同比则下滑约2%;销售额为108亿,环比增长约17%&#x…

c#数据库:vs2022 加入mysql数据源

网上有VS2019连接MySQL数据库的,那么VS2022,VS2023如果和连接到mysql数据库呢,这里总结一下我的经历: 1、首先下载ODBC驱动安装包 当前下载地址:https://dev.mysql.com/downloads/connector/odbc/ 2、ODBC安装 下载完…

小程序可拖拽按钮

你有没有遇到过在页面中有一个固定在某个位置的按钮,永远的挡住了你想要看的区域? 在小程序的列表页面中,常常会有一个提报的入口固定在右下角,如果这个按钮不可拖动的话,可能会挡住下面的事件,让用户操作起…

PyTorch包

进入PyTorch的官网: pytorch GitHub 点击GitHub: 进入PyTorch的主目录: 进入Vision reference: detection: 这就是我们在训练过程中会使用到的文件了:

如何使用springboot服务端接口公网远程调试——实现HTTP服务监听

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构、算法模板 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 二. 内网穿透…

机器学习笔记 - 复杂任务的CNN组合

基础CNN架构可通过多种方式进行组合和扩展,从而解决更多、更复杂的任务。 1. 分类和定位 在分类和定位任务中,你不仅需要说出在图像中找到的物体的类别,而且还需指出物体显现在图像中的边界框坐标。这类任务假设在图像中只有一个物体实例。 这个任务可通过在典型的分类网络…

多数据库使用django-apscheduler时,migrate后并不能生成django_apscheduler_djangojob表的问题

先说一下django-apscheduler定时器的使用过程: django-apscheduler基本使用 1.安装django-apscheduler代码如下(示例): pip install django-apscheduler 2.配置settings.py的INSTALLED_APPS代码如下(示例&#xff09…

B033-Servlet交互 JSP

目录 ServletServlet的三大职责跳转:请求转发和重定向请求转发重定向汇总请求转发与重定向的区别用请求转发和重定向完善登录 JSP第一个JSP概述注释设置创建JSP文件默认字符编码集 JSP的java代码书写JSP的原理三大指令九大内置对象改造动态web工程进行示例内置对象名…

关于elementui和ant design vue无法禁止浏览器自动填充问题

以and design vue 为例&#xff1a; 图标用来显隐账号密码 html&#xff1a; <a-form-model-item label"账号密码:" prop"password"><a-input v-if"passwordTab" ref"passwordInput" v-model"form.password" typ…