【Shell脚本】Shell编程之数组

news2024/11/18 21:33:10

目录

一.数组

1.基本概念

2.定义数组的方法

2.1.方法一

2.2.方法二

2.3.方法三

2.4.方法四

2.5.查看数组长度

2.6.查看数组元素下标

3.数组分片

4.数组字符替换

4.1.临时替换

4.2.永久替换

5.数组删除

5.1.删除某个下标

5.2.删除整组

6.数组遍历和重新定义

7.数组追加元素

7.1.方法一

7.2.方法二

7.3.方法三

7.4.方法四

8.用函数判断数组是否完整

9.向函数传数组参数

10.从函数返回数组

10.1.实操

二.数组排序算法(拓展)

1.冒泡排序

1.1.概述

1.2.基本思想

1.3.算法思路

1.4.实操

2.直接选择排序

2.1.概述

2.2.基本思想

2.3.相关实操

3.反转排序

3.1.概述

3.2.基本思想

3.3.实操


一.数组

1.基本概念

  • 数组(Array)是有序的元素序列
  • 若将有限个类型相同的变量的集合命名,那么这个名称为数组名
  • 组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量
  • 用于区分数组的各个元素的数字编号称为下标
  • 数组是在编程中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式

2.定义数组的方法

2.1.方法一

数组名=(value0 value1 value2 ...)

2.2.方法二

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

2.3.方法三

列表名="value0 value1 value2 ..."

数组名=($列表名)

2.4.方法四

数组名 [0]="value"
 
数组名 [1]="value"
 
数组名 [2]="value"

2.5.查看数组长度

echo ${#数组名[@]}

echo ${#数组名[*]}

2.6.查看数组元素下标

echo ${!数组名[@]}

echo ${!数组名[*]}

3.数组分片

echo ${数组名[@]:下标:长度}

echo ${数组名[*]:下标:长度}

4.数组字符替换

echo ${数组名[@]/旧字符/新字符}

数组名=(${数组名[*]/旧字符/新字符})        通过重新定义的方式实现永久替换

4.1.临时替换

4.2.永久替换

5.数组删除

unset 数组名[下标]                删除数组的某个下标

unset 数组名                     删除数组

5.1.删除某个下标

5.2.删除整组

6.数组遍历和重新定义

arr=(1 2 3 4 5)
n=0
for i in ${arr[@]}
do
    arr[$n]=$[i*2]
    let n++
done

7.数组追加元素

7.1.方法一

数组名[新下标]=新元素

7.2.方法二

数组名[数组长度]=新元素                        仅适用于完整的数组

7.3.方法三

数组名+=(新元素1 新元素2 ....)

7.4.方法四

数组名=("${数组名[@]}" 新元素1 新元素2 ....)

8.用函数判断数组是否完整

#!/bin/bash
#判断一个数组是否完整
array1=(10 20 30 40 50 60)
array3=([0]="a" [1]="b" [2]="c" [3]="d" [5]="f")

#获取数组长度
length1=${#array1[@]}
length3=${#array3[@]}

#获取长度n - 1 的下标
last1=$[length1 - 1]
last3=$[length3 - 1]

#获取数组最后一个元素下标
last1_num=$(echo ${!array1[@]} | awk '{print $NF}')
last3_num=$(echo ${!array3[@]} | awk '{print $NF}')

#判断长度n - 1 的下标 是否与 数组最后一个元素下标 相同
if [ $last1 -eq $last1_num ];then
     echo "array1 数组完整"
else
     echo "array1 数组不完整"
fi

if [ $last3 -eq $last3_num ];then
     echo "array3 数组完整"
else
     echo "array3 数组不完整"
fi

9.向函数传数组参数

函数名() {
     数组2=($@)         #在函数体内将传入的列表重新组成数组
     ....
}

函数名 ${数组1[@]}      #在函数体外将数组分解成列表传入

10.从函数返回数组

函数名(){
    ....
    echo ${数组2[@]}     #在函数体内以列表形式返回值
}

数组1=(函数名 参数)      #在函数体外将函数执行的结果重新组合成数组

10.1.实操

#!/bin/bash
test1() {
      #在函数里将传入的元素列表重新组成数组
      arr2=($@)
      #遍历数组方法一
      for ((i=0; i<${#arr2[@]}; i++))
      do
           arr2[$i]=$[${arr2[$i]} *2]
      done

      #从函数返回数组
      echo ${arr2[@]}
      #遍历数组方法二
      #n=0
      #for i in ${arr2[@]}
      #     arr2[$n]=$[$i * 2]
      #     let n++
      # done
}

arr1=(50 40 30 20 10)
#        向函数传入数组
result=$(test1 ${arr1[@]})

#在函数体外将函数返回的值列表重新组成数组
arr1=($result)

echo "arr double以后的值为 ${arr1[@]}"

二.数组排序算法(拓展)

1.冒泡排序

1.1.概述

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

1.2.基本思想

冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到

数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡

一样从底部上升到顶部

1.3.算法思路

冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因

为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用

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

1.4.实操

[root@localhost day14]# vim demo4.sh
[root@localhost day14]# bash demo4.sh
原始数组的顺序为 63 4 24 1 3 15
排序后数组顺序为 63 24 15 4 3 1

#!/bin/bash
#冒号排序算法

arr=(63 4 24 1 3 15)
echo "原始数组的顺序为 ${arr[@]}"

#获取数组长度
length=${#arr[@]}

#外循环确定比较轮数,比较论述为数组长度 - 1
for ((a=1; a<length; a++))
do
    #内循环来比较相邻两个元素,从小到大排序;较大的往后放,每轮的比较次数随着轮数增加而减少
    for ((b=0; b<length-a; b++))
    do
         #获取左边比较元素的值
         left=${arr[$b]}
         #获取右边比较元素的值
         c=$[b + 1]
         right=${arr[$c]}
         #比较相邻两个元素,如果左边的元素值大于右边的,则元素互换
         if [ $left -lt $right ];then
               tmp=$left
               #将原来右边元素的值定义到左边元素
               arr[$b]=$right
               #将原来左边元素的值定义到右边元素
               arr[$c]=$tmp
         fi
    done
done

    echo "排序后数组顺序为 ${arr[@]}

2.直接选择排序

2.1.概述

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些

2.2.基本思想

将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,

不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始序),

这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式

2.3.相关实操

[root@localhost day14]# vim demo5.sh
[root@localhost day14]# bash demo5.sh
原始数组的顺序为 63 4 24 1 3 15
排序后的数组顺序为 1 3 4 15 24 63

#!/bin/bash
#直接选择排序

arr=(63 4 24 1 3 15)
echo "原始数组的顺序为 ${arr[@]}"

length=${#arr[@]}
#外循环 确定排序轮数,轮数为数组长度 - 1
for ((a=1; a<length; a++))
do
    #定义初始最大元素的下标为0
    max=0
    #内循环 确定当前比较轮数最大的元素下标
    for ((b=1; b<length-a; b++))  #设置作为与初始最大元素比较的元素下标范>围
    do
         if [ ${arr[$b]} -gt ${arr[$max]} ];then
             max=$b
         fi
    done
    #用当前轮数最大的元素与当前轮数最后一个元素交换位:
    last=$[length - a]
    tmp=${arr[$last]}
    arr[$last]=${arr[$max]}
    arr[$max]=$tmp
done
    echo "排序后的数组顺序为 ${arr[@]}"

3.反转排序

3.1.概述

以相反的顺序把原有数组的内容重新排序

3.2.基本思想

把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所

有数组元素反转替换

3.3.实操

[root@localhost day14]# vim demo6.sh
[root@localhost day14]# bash demo6.sh
输入一个数组的列表: 50 42 32 11 5
原始数组的顺序为 50 42 32 11 5

#!/bin/bash
#反转排序
filp() {
array=($@)
length=${#array[@]}

for ((a=0; a<length/2; a++))
do
    tmp=${array[$a]}
    last=$[length-1-a]
    array[$a]=${array[$last]}
    array[$last]=$tmp
done

echo "反转排序后的数组顺序为 ${array[@]}"
}
read -p "输入一个数组的列表: " num
arr=($num)
echo "原始数组的顺序为 ${arr[@]}"

filp ${arr[@]}

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

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

相关文章

sql操作、发送http请求和邮件发送 全栈开发之路——后端篇(2)

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

国内好用的测试用例管理工具有哪些?

目前市面上的测试用例管理工具有很多&#xff0c;但由于针对的项目、领域、目标用户&#xff0c;功能也并不一致&#xff0c;所以选择一款适合的测试管理平台并不轻松。做好这件事&#xff0c;首先要需求明确你用测试管理工具干什么&#xff1f;最终想要达到什么目标&#xff1…

基于UnetPlusPlus(Unet++)实现的医学图像分割

1、前言 unetPlusPlus 在unet 的基础上增添了密集连接的结构&#xff0c;有点像densenet网络 因为这种密集连接&#xff0c;unet可以实现剪枝的轻量化操作。由于本人的没有接触过这种剪枝、蒸馏之类的轻量化方法&#xff0c;所以不多赘述 本章仅仅根据unet模型实现医学图像分…

西门子博途WINCC精致触摸屏配方实用一例

我们现场有一台设备&#xff0c;是用来锯切钢坯的&#xff0c;里面有几个重要的参数&#xff0c;一开始投产的时候厂家没有做配方功能&#xff0c;需要操作人员每次换钢坯就需要手动计算然后输入&#xff0c;后来有时间我就做了个这个定尺管理的功能&#xff0c;方便了操作人员…

汇昌联信电商:拼多多网店好做吗?

在电子商务的海洋中&#xff0c;拼多多以其独特的团购模式和亲民策略迅速崛起&#xff0c;吸引了大批消费者和商家的目光。对于“拼多多网店好做吗?”这个问题&#xff0c;答案并非简单的是与否&#xff0c;而是需要从多个维度进行深入分析。 一、市场定位与竞争环境 拼多多定…

华为开源自研AI框架昇思MindSpore应用案例:在ResNet-50网络上应用二阶优化实践

常见的优化算法可分为一阶优化算法和二阶优化算法。经典的一阶优化算法如SGD等&#xff0c;计算量小、计算速度快&#xff0c;但是收敛的速度慢&#xff0c;所需的迭代次数多。而二阶优化算法使用目标函数的二阶导数来加速收敛&#xff0c;能更快地收敛到模型最优值&#xff0c…

TCP的滑动窗口机制和流量控制

目录 滑动窗口 流量控制 拥塞控制 滑动窗口 TCP除了保证可靠性之外&#xff0c;也希望能够尽可能高效的完成数据传输。滑动窗口就是一种提高效率的机制。以下是不引入滑动窗口的数据传输过程&#xff1a; 可以看到&#xff0c;主机A这边每次收到一个ACK才发送下一个数据。这…

接口、会话控制

文章目录 接口介绍RESTful APIjson-server接口测试工具apipost公共参数和文档功能 会话控制cookie介绍和使用运行流程浏览器中操作Cookieexpress中cookie操作 Sessionsession运行流程&#xff1a;session中间件配置session 和 cookie 的区别CSRF跨站请求伪造 tokenJWT介绍与演示…

数据新探:用Python挖掘互联网的隐藏宝藏

Hello&#xff0c;我是你们的阿佑&#xff0c;今天给大家上的菜是——数据存储&#xff01;听起来枯燥无味&#xff1f;错了&#xff01;阿佑将带你重新认识数据存储的艺术。就像为珍贵的艺术品寻找完美的展览馆&#xff0c;为你的数据选择合适的存储方式同样重要&#xff01; …

2022-1990年 各省碳排放Co2数据集(含数据及参考文献)

碳排放是指人类活动产生的二氧化碳&#xff08;CO2&#xff09;等温室气体释放到大气中的过程。通过划分排放源的范围以避免重复计算的思想&#xff0c;由世界资源研究所在关于企业温室气体排放清单编制的指南中首次提出。城市碳排放核算边界界定借鉴该思想&#xff0c;可分为3…

Web开发三层架构

##Controller Service Dao(mapper) 软件设计&#xff1a;高内聚 低耦合 Controller 调用Service&#xff0c; Service调用 DAO 模块之间耦合 如果要从EmpServiceA切换到EmpServiceB&#xff0c;Controller代码也要修改 new EmpServiceB 分层接耦 容器中放EmpServiceA&am…

(深度估计学习)Win11复现DepthFM

目录 1. 系统配置2. 拉取代码&#xff0c;配置环境3.开始深度预测4.运行结果 论文链接&#xff1a;https://depthfm.github.io/ 讲解链接&#xff1a;https://www.php.cn/faq/734404.html 1. 系统配置 本人系统&#xff1a;Win11 CUDA12.2 python3.11.5 这里附上几个CUDA安装链…

Linux第四节--常见的指令介绍集合(持续更新中)

点赞关注不迷路&#xff01;本节涉及初识Linux第四节&#xff0c;主要为常见的几条指令介绍。 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1f44d;&#x1f3fb; 收藏 ✨ 加关注&#x1f440; 期待与你共同进步! 1. more指令 语法&#xff1a;more [选项][文件]…

【数据可视化01】matplotlib实例介绍4之六边形分箱图

目录 一、引言二、实例介绍 一、引言 hexbin是一个二维直方图&#xff0c;其中箱子是六边形&#xff0c;颜色表示每个箱子内的数据点数。 二、实例介绍 import matplotlib.pyplot as plt import numpy as np# Fixing random state for reproducibility np.random.seed(19680…

umi搭建react项目

UMI 是一个基于 React 的可扩展企业级前端应用框架&#xff0c;提供路由、状态管理、构建和部署等功能&#xff0c;可以帮助开发者快速构建复杂的单页面应用&#xff08;SPA&#xff09;和多页面应用&#xff08;MPA&#xff09;。它与 React 的关系是&#xff0c;UMI 构建在 R…

draw.io 网页版二次开发(1):源码下载和环境搭建

目录 一 说明 二 源码地址以及下载 三 开发环境搭建 1. 前端工程地址 2. 配置开发环境 &#xff08;1&#xff09;安装 node.js &#xff08;2&#xff09;安装 serve 服务器 3. 运行 四 最后 一 说明 应公司项目要求&#xff0c;需要对draw.io进行二次开发&…

算法提高之加成序列

算法提高之加成序列 核心思想&#xff1a;迭代加深 dfs 从上往下逐渐增大depth 这样下面没有用的方案就不用遍历了 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 110;int n;int path[N];//当前求哪个位置…

2.1.2 事件驱动reactor的原理与实现

LINUX 精通 2 day14 20240513 day15 20240514 算法刷题&#xff1a;2维前缀和&#xff0c;一二维差分 耗时 135min 习题课 4h 课程补20240425 耗时&#xff1a;4h 课程链接地址 回顾 怎么学0voice课网络io——一请求一线程&#xff0c;一个client一个连接再accpet分配io f…

考研数学|李林《880》做不动,怎么办!?看这一篇!

在考研数学的备考过程中&#xff0c;遇到难题是很常见的情况&#xff0c;尤其是当你尝试解决李林880习题集中的问题时。他以其难度和深度著称&#xff0c;旨在帮助考生深入理解数学分析的复杂概念。 如果你在解题过程中感到困难&#xff0c;这并不是你个人的问题&#xff0c;而…

数据库系统概论(超详解!!!)第八节 数据库设计

1.数据库设计概述 数据库设计是指对于一个给定的应用环境&#xff0c;构造&#xff08;设计&#xff09;优化的数据库逻辑模式和物理结构&#xff0c;并据此建立数据库及其应用系统&#xff0c;使之能够有效地存储和管理数据&#xff0c;满足各种用户的应用需求&#xff0c;包…