Shell编程之数组

news2024/12/29 10:51:48

目录

一、数组的基本概念

二、定义数组的方法

方法一:

​编辑

方法二:

方法三:

​编辑

方法四:

三、 数组的输出,删除和长度统计

1)数组元素的输出

2)数组全部元素输出

3)任意字符起输出任意个数数组元素 (数组切片)

4)条件判断输出方式

5)数组的删除

①删除单个数组元素

​编辑​②删除整个数组

6)数组长度统计及其其他作用

①统计数组长度的方法

②用元素个数的方法来检测数组中是否存在空值  

四、数组的遍历和替换 

1)数组的遍历

2)数组中元素的替换

①数组的临时替换

②永久替换数组内容

五、数组追加元素

1)方式一:指定位置添加

2)方式二: 末尾追加元素

3)方式三:进行末尾多元素追加

4)方法四:直接末尾追加多元素且格式最为简单 

六、数组在函数的传参

七、冒泡排序


一、数组的基本概念

数组(Array)是有序的元素序列

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

这些有序排列的同类数据元素的集合称为数组

二、定义数组的方

方法一:

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

以空格间隔,如果值为字符类型,需要加单引号或双引号
[root@localhost shuzhu]# array1=(10 20 30 40 50)
[root@localhost shuzhu]# echo ${array1[@]}
10 20 30 40 50
[root@localhost shuzhu]# echo ${array1}
10

方法二:

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

以空格间隔,“ [ ] ”里表示元素的下标,第一个元素从0开始
[root@localhost shuzhu]# array2=([0]=11 [1]=22 [3]=33 [4]=44)
[root@localhost shuzhu]# echo ${array2[*]}
11 22 33 44

方法三:

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

数组名=($列表名)
[root@localhost shuzhu]# i="a b c d e f g"
[root@localhost shuzhu]# array3=($i)
[root@localhost shuzhu]# echo ${array3[*]}
a b c d e f g

方法四:

数组名 [0]="value"

数组名 [1]="value"

数组名 [2]="value"
[root@localhost shuzhu]# array4[0]=one
[root@localhost shuzhu]# array4[1]=two
[root@localhost shuzhu]# array4[2]=three
[root@localhost shuzhu]# array4[3]=four
[root@localhost shuzhu]# array4[4]=five
[root@localhost shuzhu]# echo ${array4[*]}
one two three four five

三、 数组的输出,删除和长度统计

1)数组元素的输出

格式:echo ${数组名[下标]} 
[root@localhost shuzhu]# echo ${array1[0]}
10
[root@localhost shuzhu]# echo ${array1[3]}
40
[root@localhost shuzhu]# echo ${array1[2]}
30

2)数组全部元素输出

方式一:echo ${数组名[*]}

方式二:echo  ${数组名[@]}
[root@localhost shuzhu]# echo ${array1[*]}
10 20 30 40 50
[root@localhost shuzhu]# echo ${array1[@]}
10 20 30 40 50

3)任意字符起输出任意个数数组元素 (数组切片)

方式一:echo ${数组名[*]:下标:个数}

方式一:echo ${数组名[@]:下标:个数}
[root@localhost shuzhu]# echo ${array1[@]:2:3}
30 40 50

4)条件判断输出方式

该输出方式,当数组存在元素,则输出数组的,如果不存在,则输出我们指定的内容

格式:echo ${数组名:-'选择输出的内容'}

5)数组的删除

①删除单个数组元素

格式: unset   数组名[N]      ##其中N为存在元素的数组下标
[root@localhost shuzhu]# echo ${array2[*]}
11 12 13 14 15 16 17 18 19 20
[root@localhost shuzhu]# unset array2[3]
[root@localhost shuzhu]# echo ${array2[*]}
11 12 13 15 16 17 18 19 20

​②删除整个数组

格式:  unset  数组名[*]    或则  unset  数组名[@]
[root@localhost shuzhu]# echo ${array2[*]}
11 12 13 15 16 17 18 19 20
[root@localhost shuzhu]# unset array2[*]
[root@localhost shuzhu]# echo ${array2[*]}
 
[root@localhost shuzhu]# 

6)数组长度统计及其其他作用

①统计数组长度的方法

格式:echo ${#数组名[*]}或则 echo ${#数组名[@]}
[root@localhost shuzhu]# echo ${#array2[*]}
10
[root@localhost shuzhu]# echo ${#array2[@]}
10
[root@localhost shuzhu]# 

②用元素个数的方法来检测数组中是否存在空值  

数组空值产生的原因:

我们用方法四定义数组元素值时,可以随意指定下标位置,但与此同时中间的有些数组下标中的元素就成了空值 。

操作过程: 

  1.  定义一个变量获取数组的长度:新变量= ${#数组名[*]}
  2. 输出依据数组长度的最后一个元素:echo  ${数组名[lenth-1]]
  3. 与数据列表最后一个值进行比较 
[root@localhost shuzhu]# arr1[0]=111
[root@localhost shuzhu]# arr1[2]=112
[root@localhost shuzhu]# arr1[3]=113
[root@localhost shuzhu]# arr1[4]=114
[root@localhost shuzhu]# lenth=${#arr1[*]}
[root@localhost shuzhu]# echo ${arr1[lenth-1]}
113
[root@localhost shuzhu]# echo ${arr1[*]}
111 112 113 114

  

四、数组的遍历和替换 

1)数组的遍历

我们可以用数组存储多个元素作为循环条件来使用,当数组配上循环,就可以形成一个指定范围和数据的遍历

[root@localhost shuzhu]# arry=(1 2 3 4 5 6 7 8 9 10)
[root@localhost shuzhu]# for i in ${arry[*]}
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10

 

2)数组中元素的替换

①数组的临时替换

格式: echo ${数组名[*]/被替换的字符或字段/新的字符或字段} 
[root@localhost shuzhu]# arry=(100 200 300 400 500 600 700)
[root@localhost shuzhu]# echo ${arry[*]/00/22}
122 222 322 422 522 622 722
[root@localhost shuzhu]# echo ${arry[*]/2/3}
100 300 300 400 500 600 700
[root@localhost shuzhu]# echo ${arry[*]/300/200}
100 200 200 400 500 600 700
[root@localhost shuzhu]# echo ${arry[*]}
100 200 300 400 500 600 700
[root@localhost shuzhu]# 

  

②永久替换数组内容

原理描述: 用一个新的数组去接收临时替换的数组的元素(达到永久替换的效果)

[root@localhost shuzhu]# arry=(100 200 300 400 500 600 700)
[root@localhost shuzhu]# echo ${arry[*]}
100 200 300 400 500 600 700
[root@localhost shuzhu]# arry1=${arry[*]/300/200}
[root@localhost shuzhu]# echo ${arry1[*]}
100 200 200 400 500 600 700

五、数组追加元素

1)方式一:指定位置添加

与定义数组方法4一样,直接赋予新值覆盖原来的元素

数组名[N]=新value

2)方式二: 末尾追加元素

格式: 数组名[${#数组名[*]}] =新元素   或     数组名[${#数组名[@]}] =新元素
[root@localhost shuzhu]# echo ${arry[*]}
100 200 300 400 500 600 700
[root@localhost shuzhu]# arry[${#arry[*]}]=800
[root@localhost shuzhu]# echo ${arry[*]}
100 200 300 400 500 600 700 800

  

3)方式三:进行末尾多元素追加

格式:数组名=("${数组名[@]}"  value1   value2 ......valueN) 
[root@localhost shuzhu]# arry=(100 200 300 400 500 600 700)
[root@localhost shuzhu]# echo ${arry[@]}
100 200 300 400 500 600 700
[root@localhost shuzhu]# arry=("${arry[@]}" 800 900 1000)
[root@localhost shuzhu]# echo ${arry[@]}
100 200 300 400 500 600 700 800 900 1000

4)方法四:直接末尾追加多元素且格式最为简单 

格式:  数组名+=(value1 value2 ........valueN)
[root@localhost shuzhu]# arry=(100 200 300 400 500 600 700)
[root@localhost shuzhu]# echo ${arry[@]}
100 200 300 400 500 600 700
[root@localhost shuzhu]# arry+=(800 900 1000)
[root@localhost shuzhu]# echo ${arry[@]}
100 200 300 400 500 600 700 800 900 1000

六、数组在函数的传参

需求:定义一个遍历数组的函数,并且让数组里的元素翻倍输出

#!/bin/bash
a=0
double (){
local array=$@
for i  in  ${array[@]}
do
 let i*=2
array[$a]=$i
let a++
done
echo ${array[@]}
}
 
 
##########main#########
array=(10 20 30 40 50)
RESULT=$(double ${array[@]})
echo "翻倍后的数组为" $RESULT

验证:

七、冒泡排序

#!/bin/bash
MAOPAO(){
arr=($@)
#获取数组的长度
length=${#arr[@]}

#外层循环用来定义比较轮数,比较轮数为数组长度减1,且从1开始
for ((a=1;a<length-a;b++));do
  #内层循环用来确定比较元素的位置,比较相邻两个元素,较大的元素往后移,并且比较次数会随着比较轮数的增加而减少
  for ((b=0;b<length-a;b++));do
    #获取相邻两个元素的前面元素的值
    first=${arr[$b]}
    #获取相邻两个元素的后面元素的值
    c=$[b + 1]
    second=${arr[$c]}
    #比较两个相邻元素的值大小,如果前面元素的值较大,则与后面元素交换位置
    if [ $first -lt $second ];then
      #使用临时变量保存前面元素的值,实现两个相邻元素交换位置
      tmp=$first
      arr[$b]=$second
      arr[$c]=$tmp
    fi
  done
done

echo "冒泡排序后的数组的值为:${arr[@]}"

}

#### main ####
read -p "请输入一组列表:" num

array=($num)
echo "旧数组的值为:${array[@]}"

MAOPAO ${array[@]}

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

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

相关文章

一种用于提高无线传感器网络寿命的改进LEACH协议(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 无线传感器网络具有网络灵活性强、网络规模可变等优点&#xff0c;广泛应用于军事、工业等领域。无线传感器网络的基本网络路由…

Mybatis一级缓存详解

目录 一级缓存 一级缓存的组织 一级缓存的生命周期 一级缓存的工作流程 Cache接口的设计以及CacheKey的定义 一级缓存的性能分析 一级缓存与Spring 事务一级缓存存在的弊端 官方文档分析 Spring通过Mybatis调用数据库的过程 一级缓存 对于会话&#xff08;Session&am…

Nacos-01-Nacos基本介绍

背景 ​ 服务发现是⼀个古老的话题&#xff0c;当应用开始脱离单机运行和访问时&#xff0c;服务发现就诞生了。目前的网络架构是每个主机都有⼀个独立的 IP 地址&#xff0c;那么服务发现基本上都是通过某种方式获取到服务所部署的 IP 地址。DNS 协议是最早将⼀个网络名称翻译…

让AI帮忙写个需求,AI写出来了,只是有bug而已

需求 使用原生JS和iframe&#xff0c;嵌入网页进行轮播&#xff0c;需要可以点击暂停、上一页、下一页。 AI的答案 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>轮播图</title><style>* {margin: 0;padd…

看板项目管理:如何可视化工作以提高生产力?

如果你一直关心优化工作流程&#xff0c;提高你或团队的生产力&#xff0c;你肯定听说过看板这个词。 看板是一种工作管理方法&#xff0c;可以将整个工作流程以及构成工作流程的每个单独活动可视化&#xff0c;从而可以识别瓶颈和优化整体流程。 在这方面&#xff0c;看板的…

Python基础(二)

目录 一、类型转换 1、为什么需要数据类型转换 2、数据类型转化的函数 3、str()函数类型转换使用 4、int()函数类型转换使用 4.1int()不能将str类型数据转换成int 4.2int()将bool类型转换成int 4.3int()将float转换成int 5、Float()函数类型转换使用 5.1Float()函数不…

ros imu可视化(ubantu)

可以用下面的链接安装ros 安装ros 在home下建立workspace&#xff0c;添加环境变量 export $ROS_PACKAGE_PATHROS_PACKAGE_PATH:/home/workspace在workspace下建立src文件夹&#xff0c;将fdilink_ahrs_ROS1解压在src目录下面 在workspace下运行以下命令&#xff1a; catkin_…

【牛客面试必刷TOP101】有效括号序列、滑动窗口的最大值

BM44 有效括号序列 点击进入该题 描述&#xff1a; 给出一个仅包含字符’(‘,’)‘,’{‘,’}‘,’[‘和’],的字符串&#xff0c;判断给出的字符串是否是合法的括号序列。 括号必须以正确的顺序关闭&#xff0c;"()“和”()[]{}“都是合法的括号序列&#xff0c;但”(]“…

(七)如何实现即时通信系统中用户的文字聊天功能?

文章目录 一、引言二、实现用户文字功能2.1 使用QTextEdit控件实现用户输入文字消息2.2 实现文字消息的发送和接收2.3 实现文字消息的展示和管理 三、解码接收到的文字消息3.1 接收数据并解码3.2 在客户端展示文字消息3.3 客户端关键代码展示3.4 服务端关键代码展示 四、效果展…

干货 | 如何做一个简单的访谈研究?

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 心理学中研究中&#xff0c;大家常用的研究方法大多是实验法、问卷调查法等&#xff0c;这些均是定量研究。 其实&#xff0c;作为质性研究中常用的访谈法&#xff0c;可对个体的内心想法进…

【操作系统】从操作系统底层出发,成为更好的程序员

冯老爷子的模型 首先&#xff0c;我们从一个问题开始(&#xffe3;∇&#xffe3;)/ 为什么需要程序员&#xff1f; 早期的计算机程序是硬件化的&#xff0c;即使用各种门电路组装出一个固定的电路板&#xff0c;这个电路板只能用于执行某个特定的程序&#xff0c;如果需要修…

学生电费管理系统

随着现代化的发展和科技的进步&#xff0c;各种智能化的系统应运而生。其中&#xff0c;学生电费管理系统是一个非常实用的系统&#xff0c;它可以帮助学校管理电费&#xff0c;提高学生的电费管理意识&#xff0c;减少学校的电费支出。本文将着重介绍该系统的作用、特点以及优…

【hive】基于Qt5和libuv udp 的lan chat

作者已经不更新了,但是很棒 在线用户列表: 聊天窗口 主程序 单独的网络线程: network_thread data管理关联网络管理的 程序update升级更新 和消息收到 即可

【Java】面试常问知识点(数据库相关知识)

Redis Redis数据结构&#xff0c;跳表如何实现&#xff1f;跳表添加层级的时机&#xff1f; 布隆过滤器的底层原理 Redis数据结构 有5中数据结构&#xff0c;string&#xff08;字符串类型&#xff09;、list&#xff08;列表类型&#xff09;、hash&#xff08;哈希表类型…

Ubuntu 20.04 系统配置 OpenVINO 2022.3 环境

由于 OpenVINO 2021 版本在调用 IECore 时会出现 Segmentation fault 的问题&#xff0c;因此需要将其升级为 2022 版本的。 1. 卸载原来版本的 OpenVINO 进入OpenVINO的卸载目录&#xff0c;通常在 /opt/intel 文件夹下&#xff0c; cd /opt/intel/openvino_2021/openvino_…

SOA协议DDS和Some/IP对比

SOME/IP 和 DDS 均已被纳入AUTOSAR AP的平台标准中。 SOME/IP 和 DDS是在不同的应用场景和不同的需求下诞生的技术&#xff0c;所以它们之间注定有很大的区别。 SOME/IP SOME/IP的全称为&#xff1a;Scalable service-Oriented MiddlewarE over IP&#xff0c;是一种面向服务…

Codeforces Round 871 (Div. 4)【A、B、C、D、E、F、G、H】

文章目录 A. Love Story(模拟)B. Blank Space(模拟)C. Mr. Perfectly Fine&#xff08;模拟&#xff09;D. Gold Rush(小思维)E. The Lakes(DFS)F. Forever Winter(简单的图)G. Hits Different&#xff08;二维前缀和&#xff09;H. Dont Blame Me(状态压缩dp) 传送门 A. Love …

视频文本检索之CLIP4Clip

论文&#xff1a;CLIP4Clip: An Empirical Study of CLIP for End to End Video Clip Retrieval GitHub&#xff1a;https://github.com/ArrowLuo/CLIP4Clip 论文基于图片-文本检索模型CLIP (Contrastive Language-Image Pretraining)提出了视频-文本检索模型CLIP4Clip (CLIP …

【开源硬件篇】STM32F103C8T6主控板

STM32F103C8T6主控板 文章目录 STM32F103C8T6主控板设计目标一、STM32F103C8T6核心板外围引脚电路1.1 原理图设计1.2 PCB设计用例 二、ISP一键下载电路设计2.1 原理图设计2.2 原理分析2.2.1 CH340电路选择2.2.2 ISP一键下载原理 2.3 PCB设计示例 三、串口通信电路3.1 原理图设计…

Jackson2JsonRedisSerializer使用及问题

1、使用 public static RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {lettuceConnectionFactory.setShareNativeConnection(false);RedisTemplate<String, Object> rt new RedisTemplate<>();// 设置…