【Shell脚本】Shell编程之数组

目录

一.数组

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[@]}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024洗地机爆款榜单,哪个牌子洗地机值得买?助你轻松选对洗地机

随着现代生活节奏的加快&#xff0c;人们对于家庭清洁的需求也越来越高。家用洗地机作为一种高效清洁工具&#xff0c;能够帮助您轻松应对家庭地板的清洁问题&#xff0c;节省时间和精力。然而&#xff0c;在选择洗地机时&#xff0c;究竟哪个牌子的洗地机值得买呢&#xff1f;…

【 第一性原理计算方法及应用】

第一性原理计算方法及应用述

Android Iptables 客制化方法及基本使用

Android Iptables 客制化方法及基本使用 Android netd 的自定义链NetdConstants.cpp 的 execIptablesRestore 方法IptablesRestoreController 的 execute 方法使用 oem-iptables-init.sh 添加自定义的防火墙规则oem-iptables-init.sh 示例文件 基本概念Iptables 链Iptables 表 …

关于nvm管理node版本的一些问题

背景&#xff1a; 基于开发项目的迭代不能做到全部更新&#xff0c;有的项目是vue2.0 有的项目是vue3.0&#xff0c; 那么我们开发的时候就需要对node 进行更新&#xff0c;进而产生因为版本不同导致的错误&#xff1a;由此我们需要一款管理 切换node版本的东西&#xff0c;那就…

其它高阶数据结构①_并查集(概念+代码+两道OJ)

目录 1. 并查集的概念 2. 并查集的实现 3. 并查集的应用 3.1 力扣LCR 116. 省份数量 解析代码1 解析代码2 3.2 力扣990. 等式方程的可满足性 解析代码 本篇完。 写在前面&#xff1a; 此高阶数据结构系列&#xff0c;虽然放在⑤数据结构与算法专栏&#xff0c;但还是作…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷5(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

idea2023.3.2版本全局设置maven地址

idea每次新建项目都默认使用了一个user目录下的地址&#xff0c;而不是自己安装的maven地址&#xff0c;每次创建项目后&#xff0c;都要重新从settings中设置一下maven地址。 可以全局修改&#xff1a;首先在File-->Close Project回到idea最开始的界面 然后在Customize里点…

Spring Boot 整合讯飞星火3.5通过接口Api接口实现聊天功能(首发)复制粘贴即可使用,后续更新WebSocket实现聊天功能

程序员必备网站&#xff1a; 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1.pom.xml <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.72</version></dependency><depen…

我和jetson-Nano的故事(10)——安装OpenCV3.2.0

1. 仓库地址 opencv https://opencv.org/releases/page/6/opencv_contrib https://github.com/opencv/opencv_contrib/tree/3.2.0 2. cmake-gui安装 安装指令 sudo apt-get install cmake-qt-gui如果安装过程中入到下面的问题 可以按照以下方法解决 sudo apt --fix-broke…

Cartographer前后端梳理

0. 简介 最近在研究整个SLAM框架的改进处&#xff0c;想着能不能从Cartographer中找到一些亮点可以用于参考。所以这一篇博客希望能够梳理好Cartographer前后端优化&#xff0c;并从中得到一些启发。carto整体是graph-based框架&#xff0c;前端是scan-map匹配&#xff0c;后端…

SpringBoot自动装配(二)

近日&#xff0c;余溺于先贤古哲之文无法自拔。虽未明其中真意&#xff0c;但总觉有理。遂抄录一篇以供诸君品鉴——公孙鞅曰&#xff1a;“臣闻之&#xff1a;‘疑行无名&#xff0c;疑事无功。’君亟定变法之虑&#xff0c;殆无顾天下之议之也。且夫有高人之行者&#xff0c;…

52岁「豹嫂」代夫尽孝送花畀奶奶被赞

歌手胡蓓蔚与「豹哥」单立文相爱28年&#xff0c;两人曾上节目分享婚姻之道&#xff0c;指婚姻最紧要有忍耐力&#xff0c;要抗拒引诱。其实除了忍耐力&#xff0c;胡蓓蔚和奶奶相处都有一套。 早前单立文带胡蓓蔚及妈妈到米芝连一星餐厅叹美食&#xff0c;庆祝奶奶89岁生日&am…

数据结构之二叉树详解[1]

在前面我们介绍了堆和二叉树的基本概念后&#xff0c;本篇文章将带领大家深入学习链式二叉树。 1.预备知识 2.二叉树结点的创建 3.二叉树的遍历 3.1前序遍历 3.2中序遍历 3.3 后序遍历 4.统计二叉树的结点个数 5.二叉树叶子结点的个数 6.二叉树第k层的结点个数 7.总结 …

如何使用恢复模式修复Mac启动问题?这里提供详细步骤

如果你的Mac无法启动,不要惊慌,Mac有一个隐藏的恢复模式,你可以使用它来诊断和修复任何问题,或者在需要时完全重新安装macOS。以下是如何使用它。 如何在Mac上启动到恢复模式 你需要做的第一件事是启动到恢复模式。尽管操作说明会因你使用的Mac电脑而异,但幸运的是,启动…

[数据结构1.0]快速排序

最近学习了快速排序&#xff0c;鼠鼠俺来做笔记了&#xff01; 本篇博客用排升序为例介绍快速排序&#xff01; 1.快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#x…

(四)Spring教程——控制反转或依赖注入与Java的反射技术

IoC的底层实现技术是反射技术&#xff0c;目前Java、C#、PHP 等语言均支持反射技术。 在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够获取到这个类的所有属性和方法&#xff1b;对任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff08;包括私有的方法…

【数据可视化01】matplotlib实例3之数据统计

目录 一、引言二、实例介绍1.百分位数为横条形图2.箱线图定制化3.带有自定义填充颜色的箱线图4.箱线图5.箱线图和小提琴图6.二维数据集的置信椭圆 一、引言 matplotlib库 可以用来创建各种静态、动态、交互式的图形&#xff0c;并广泛应用于数据分析和数据可视化领域。 二、实…

6. 第K小的和-二分

6.第K小的和 - 蓝桥云课 (lanqiao.cn) #include <bits/stdc.h> #define int long long #define endl \n using namespace std; int n,m,k,an[100005],bm[100005]; int check(int x){int res0;//序列C中<x的数的个数for(int i0;i<n;i){//遍历数组A&#xff0c;对于每…

【Linux】如何在Linux中配置自己的环境变量?

文章目录 配置环境变量方法一&#xff1a;【>>】使用追加重定向方法二&#xff1a;使用【export PATH$PATH:/路径】(推荐) 配置环境变量 那要怎么去将一个系统路径添加到【环境变量】中呢 方法一&#xff1a;【>>】使用追加重定向 &#x1f6a9;这里一定要主要覆盖…

mongodb备份还原指南

MongoDB 提供的命令行实用程序mongodump和mongorestore创建备份和恢复数据的过程。 一、数据备份 mongorestore和mongodump实用程序可处理BSON数据转储&#xff0c;对于创建小型部署的备份非常有用。要实现弹性且无中断的备份&#xff0c;请将文件系统快照或区块级磁盘快照与…