Shell脚本五:函数和数组

news2024/9/30 9:33:23

文章目录

  • 1.函数
    • 1.1Shell函数的概念
    • 1.2函数的好处
    • 1.2函数的组成
    • 1.3函数的结构
    • 1.4查看函数列表
    • 1.5删除函数
    • 1.6函数的返回值
      • 1.6.1使用原则
      • 1.6.2示例
    • 1.7函数的作用范围
    • 1.8函数递归
      • 1.8.1示例
  • 2.数组
    • 2.1什么是数组
    • 2.2数组的作用
    • 2.3数组名和索引
    • 2.4定义数组的方式
    • 2.5普通数组和关联数组
      • 2.5.1普通数组
      • 2.5.2关联数组
    • 2.6引用数组中的值
      • 2.6.1数组包括的数据类型
      • 2.6.2 获取数值长度
      • 2.6.3 获取数值列表
      • 2.6.4 读取某个下标赋值
    • 2.7数组脚本内相关操作
      • 2.7.1 数组遍历
      • 2.7.2数据切片
      • 2.7.3数组替换
      • 2.7.4 删除数组
    • 2.8 冒泡排序
      • 2.8.1什么是冒泡排序
      • 2.8.2 基本思想
      • 2.8.3 算法思路
      • 2.8.4 示例
    • 2.9 数组示例

1.函数

1.1Shell函数的概念

函数的数学表达式sin、cos、tan 其实只是定义好的计算公式,函数就是一个功能模块,在函数中写好需要执行的命令即可

1.2函数的好处

  • 使用函数可以避免代码重复
  • 使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强

1.2函数的组成

函数名和函数体

1.3函数的结构

【1】
function 函数名 {
	命令序列
}

【2】
函数名() {
	命令序列
}

【3】
function 函数名 (){
	命令序列
}
示例:
[root@localhost ~]#name () { hostname;}
#定义函数
[root@localhost ~]#name  #输出函数
localhost.localdomain

在这里插入图片描述
注意事项

  1. 直接写 函数中调用函数 直接写函数名

  2. 同名函数 后一个生效

  3. 调用函数一定要先定义

  4. 只要先定义了调用的 其他函数定义顺序无关

1.4查看函数列表

declare -F
#查看当前已定义的函数名
declare -f
#查看当前已定义的函数定义
declare -f func_name 
#查看指定当前已定义的函数名
declare -F func_name
#查看当前已定义的函数名定义

1.5删除函数

unset 函数名
#删除函数

在这里插入图片描述

1.6函数的返回值

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

1.6.1使用原则

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

1.6.2示例

#!/bin/bash
test1 () {
        read -p "请输入一个数字:" num
        return $[$num*2]

}

test1
echo $?

在这里插入图片描述

1.7函数的作用范围

函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
在这里插入图片描述
将变量限定在函数内部使用local命令
在这里插入图片描述

1.8函数递归

函数调用自己本身的函数

1.8.1示例

阶乘

#定义函数
fach () {
if [ $1 -eq 0 -o $1 -eq 1 ]
then
echo 1
else
#调用函数
echo $[$1*$[(fach $[$1-1])]
fi
}
fach $1

在这里插入图片描述

2.数组

2.1什么是数组

数组是一种数据结构,用于存储一组相同类型的元素。

数组是一个连续的内存区域,元素在内存中按照顺序存储,每个元素可以通过索引访问,索引从0开始,逐个递增。

2.2数组的作用

数组可以存储各种类型的数据,例如整数、浮点数、字符、字符串等。

数组常用于存储和处理大量数据,提供了便捷的方式来访问和操作这些数据。

2.3数组名和索引

-索引的编号从0开始,属于数值索引
-索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引
-bash的数组支持稀疏格式(索引不连续)

2.4定义数组的方式

方式一:一次性赋值全部

数组名=(valueo0 value1 value2....

在这里插入图片描述
方式二:通过下标赋值

数组名=[0]=value [1]=value [2]=value...)

在这里插入图片描述
方式三:先创建列表,再赋值

列表名=“value0 value1 value2.. ”
数组名=($列表名)

在这里插入图片描述
方式四:一个一个赋值

数组名[0]="value0"
数组名[1]="value1"
数组名[2]="value2"

在这里插入图片描述
方式五:交互型

read -a 数组名
#自行赋值

在这里插入图片描述

下标值和索引值表示相同的意思,即元素在数组中的位置
数组的下标值从0开始,逐个递增,用于唯一标识数组中的每个元素

2.5普通数组和关联数组

2.5.1普通数组

  • 使用连续的整数值作为索引,从0开始递增
  • 声明时使用 declare 或 declare -a 命令
  • 元素之间的顺序是固定的,根据索引进行访问

示例

xinshi=("liu" "guan" "zhang")
echo ${xinshi[1]} #输出guan
echo ${xinshi[2]} #输出zhang

普通数组使用整数索引访问数组中的元素。

2.5.2关联数组

使用任意字符串作为键来访问和存储元素
声明时使用 declare -A 命令
元素之间的顺序是不固定的,通过键进行访问

示例

declare -A nianlin
nianlin["liu"]=30
nianlin["guan"]=45

echo ${nianlin[liu]}      #输出30
echo ${nianlin[guan]}  #输出45

关联数组使用字符串进行访问数组中的元素。

2.6引用数组中的值

2.6.1数组包括的数据类型

  • 数值类型
  • 字符类型

使用 " " 或 ’ ’ 定义

2.6.2 获取数值长度

echo ${#数组名 [*]}
echo ${#数组名[@]}

在这里插入图片描述

2.6.3 获取数值列表

echo ${数组名 [*]}
echo ${数组名[@]}

在这里插入图片描述

2.6.4 读取某个下标赋值

自定义名=${数组名[下标号]}

在这里插入图片描述

2.7数组脚本内相关操作

2.7.1 数组遍历

数组遍历是指按顺序访问数组中的每个元素。

#!/bin/bash
a=(1 2 3 4 5 6) #定义数组

for i in ${a[@]} #将数组内赋值定义循环变量
do
echo $i #输出变量
done

在这里插入图片描述

2.7.2数据切片

挑选数组中某一段进行输出

#!/bin/bash
a=(1 2 3 4 5 6)
#定义数组
echo ${a[@]:1:3}
#获取 ${数组名[@或*]:起始位置:长度} 的值

在这里插入图片描述

2.7.3数组替换

用当前所需数据替换原有数据
只是临时替换

#!/bin/bash
a=(1 2 3 4 5 6)
#定义源数组
echo ${a[*]/5/55}
#${数组名[@或*]/查找字符/替换字符}
echo ${a[*]}
#查看是不是永久替换

在这里插入图片描述

2.7.4 删除数组

整个删除

unset 数组名

在这里插入图片描述
选择删除

unset 数组名[下标号]

在这里插入图片描述

2.8 冒泡排序

2.8.1什么是冒泡排序

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

2.8.2 基本思想

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

2.8.3 算法思路

冒泡算法由双层循环实现
外部循环

用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。

内部循环

主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,
对比和交换次数随排序轮数而减少。

2.8.4 示例

升序排序

#!/bin/bash
a=(10 1 20 30 99 11)    #定义数组
l=${#a[*]}              
#定义比较轮数 比较轮数为数组长度减1,从1开始 
for ((i=1;i<$l;i++))
do
        for ((j=0;j<$l-1;j++))#确定比较元素的位置,比较相邻两个元素,较大的数往后放,比较次数随比较轮数而减少
        do
        first=${a[$j]} #定义第一个元素的值
        k=$[$j+1]      #定义第二个元素的值
        second=${a[$k]}

        if [ $first -gt $second ] #如果第一个元素比第二个元素大就互换
        #如果小于就为降序
        then
        temp=$first
        a[$j]=$second
        a[$k]=$temp
        #把临时变量(也就是第一个元素原值)赋给第二个元素
        fi
        done
done
echo ${a[@]}
#输出排序后的数组

在这里插入图片描述

2.9 数组示例

取出最大值

#!/bin/bash
a=(10 1 20 30 99 101) #定义数组
 
max=${a[0]}
l=${a[*]}
for ((i=0;i<$l;i++))
do
    if [[ $max -lt ${a[$i+1]} ]]
    then
    max=${a[$i+1]}
    fi
done
echo $max

在这里插入图片描述

取出最小值

#!/bin/bash
read -p "请输入数字与" num
a=($num)
min=${a[0]}

for ((i=0;i<${#a[*]}-1;i++))
do
       if [[ $min -ge ${a[$i+1]} ]]
       then
       echo
       min=${a[$i=1]}
       fi
done
echo "数组中最小的是:" $min

在这里插入图片描述

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

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

相关文章

深入理解分布式架构,构建高效可靠系统的关键

深入探讨分布式架构的核心概念、优势、挑战以及构建过程中的关键考虑因素。 引言什么是分布式架构&#xff1f;分布式架构的重要性 分布式系统的核心概念节点和通信数据分区与复制一致性与一致性模型负载均衡与容错性 常见的分布式架构模式客户端-服务器架构微服务架构事件驱动…

对Lua的理解

在redis和nginx中都潜入了Lua环境用于快速上手开发。但如何理解Lua以及Lua与宿主环境的交互是需要掌握的。 首先是Lua本身&#xff0c;打开5.1的lua版本开始编译后最后生成一个lua的可执行文件&#xff0c;这其实就是一个包含了Lua虚拟机的终端.。所以其实在不管redis也好nginx…

2023/8/20周报

目录 摘要 论文阅读 1、标题和现存问题 2、准备知识 3、模型结构 4、实验准备 5、实验结果 深度学习 1、构建图数据 2、GCN模型 3、当前实验结果 总结 摘要 本周在论文阅读上&#xff0c;阅读了一篇时空图卷积网络:交通预测的深度学习框架的论文。文章的时空图卷积…

NOIP2014普及组,提高组 比例简化 飞扬的小鸟 答案

比例简化 说明 在社交媒体上&#xff0c;经常会看到针对某一个观点同意与否的民意调查以及结果。例如&#xff0c;对某一观点表示支持的有1498 人&#xff0c;反对的有 902人&#xff0c;那么赞同与反对的比例可以简单的记为1498:902。 不过&#xff0c;如果把调查结果就以这种…

Leetcode-每日一题【剑指 Offer 33. 二叉搜索树的后序遍历序列】

题目 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树&#xff1a; 5 / \ 2 6 / \ 1 3 示例 1&#xff1a; 输入: […

第4天----找出第一个只出现一次的字符(桶计数法/4种思路讲解)

题目描述 给定一个只包含小写字母的字符串&#xff0c;请你找到第一个仅出现一次的字符。如果没有&#xff0c;输出 no。 输入格式 一个字符串&#xff0c;长度小于 1100。 输出格式 输出第一个仅出现一次的字符&#xff0c;若没有则输出 no。 输入输出样例 输入 #1复制 abc 输…

鸿蒙/Android上最大的毒瘤:快应用服务

鸿蒙/Android上最大的毒瘤&#xff1a;快应用服务 2023.3.22版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、什么是快应用&#xff1f; “快应用” 是安卓厂&#xff08;华&#xff0c;米&#xff0c;O、V、魅族、努、联、加&#xf…

消息中间件的选择:RabbitMQ是一个明智的选择

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; MQ&#xff08;Message Queue&#xff09; MQ&#xff08;消息队列&#xff09;是一种用于在应用程序之间进行异步通信的技术&#xff1b;允许应用程序通过发送和接收…

[虚幻引擎] DTGlobalVariable 插件说明,蓝图全局变量访问,设置, Get, Set。

本插件可以在蓝图或者UMG中直接访问指定的全局变量值&#xff0c;方便编写。 支持Bool&#xff0c;Byte&#xff0c;Int&#xff0c;Int64&#xff0c;Float&#xff0c;Name&#xff0c;String&#xff0c;Text&#xff0c;Vector&#xff0c;Rotator&#xff0c;Transform&am…

【Linux网络】网络编程套接字 -- 基于socket实现一个简单UDP网络程序

认识端口号网络字节序处理字节序函数 htonl、htons、ntohl、ntohs socketsocket编程接口sockaddr结构结尾实现UDP程序的socket接口使用解析socket处理 IP 地址的函数初始化sockaddr_inbindrecvfromsendto 实现一个简单的UDP网络程序封装服务器相关代码封装客户端相关代码实验结…

TE-L-Tyrosine (FET-precursor),合成蛋白质的必需成分之一,L-Tyrosine

试剂简介&#xff1a;TE-L-Tyrosine (FET-precursor)&#xff0c;L-Tyrosine是一种氨基酸&#xff0c;它是蛋白质合成的必需成分之一。除了在蛋白质合成中的重要作用外&#xff0c;L-Tyrosine还具有多种生理功能。它是肾上腺素、去甲肾上腺素、甲状腺激素等重要激素的前体物质&…

短视频矩阵系统源码|开发者步骤

一、为了开发和部署短视频矩阵系统&#xff0c;首先需要进行以下步骤&#xff1a; 1. 系统设计与开发&#xff1a;根据需求&#xff0c;进行系统架构设计&#xff0c;并选择合适的技术栈进行开发。这可能涉及到前端开发、后端开发、数据库设计等工作。 2. 实现核心功能&#…

AIGC与软件测试的融合

一、ChatGPT与AIGC 生成式人工智能——AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;&#xff0c;是指基于生成对抗网络、大型预训练模型等人工智能的技术方法&#xff0c;通过已有数据的学习和识别&#xff0c;以适当的泛化能力生成相关内容的技术。…

MySQL运行时的可观测性

1.说在前面的话 2.安装employees测试库 3.观测SQL运行状态 3.1 观测SQL运行时的内存消耗3.2 观测SQL运行时的其他开销3.3 观测SQL运行进度 感知SQL运行时的状态 1. 说在前面的话 在MySQL里&#xff0c;一条SQL运行时产生多少磁盘I/O&#xff0c;占用多少内存&#xff0c;是否…

Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 全

Ctfshow 命令执行 web29 pregmatch是正则匹配函数&#xff0c;匹配是否包含flag&#xff0c;if(!preg_match("/flag/i", $c))&#xff0c;/i忽略大小写 可以利用system来间接执行系统命令 flag采用f*绕过&#xff0c;或者mv fl?g.php 1.txt修改文件名&#xff0c…

一文彻底理解时间复杂度和空间复杂度(附实例)

目录 1 PNP&#xff1f;2 时间复杂度2.1 常数阶复杂度2.2 对数阶复杂度2.3 线性阶复杂度2.4 平方阶复杂度2.5 指数阶复杂度2.6 总结 3 空间复杂度 1 PNP&#xff1f; P类问题(Polynomial)指在多项式时间内能求解的问题&#xff1b;NP类问题(Non-Deterministic Polynomial)指在…

数据中心UPS监控,不服不行!

UPS作为关键的电力保障设备&#xff0c;它在电力中断或波动的情况下&#xff0c;为电子设备提供稳定的备用电源&#xff0c;以防止数据丢失、设备损坏或生产中断。 通过远程监控、电池健康检测、负载管理、警报通知等功能&#xff0c;UPS监控确保了系统的高效运行和可靠性。同时…

Windows下安装tomcat无法启动问题汇总和解决

tomcat在初学的时候安装总是出现各种问题&#xff0c;最近重新安装了一次&#xff0c;居然也被一些小问题导致无法启动了&#xff0c;特此写下这篇文章&#xff0c;希望能帮助到大家 导致tomcat启动失败原因 1、未配置tomcat环境变量: CATALINA_HOME&#xff1b;然后path环境…

扭矩张力控制和速度张力控制详细介绍

张力控制的开环和闭环相关算法介绍,请查看下面文章链接: PLC张力控制(开环闭环算法分析)_张力控制plc程序实例_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕…

LeetCode(力扣)404. 左叶子之和Python

LeetCode404. 左叶子之和 题目链接代码 题目链接 左叶子之和 代码 递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right …