Linux shell编程 数组 ^ 数组排序

news2024/12/23 10:05:06

数组定义

数组内数据类型可以为数值也可以为字符串。

若字符串类型需要使用 ' '    " " 包含以免空格扰乱数组。

方法1

空格分隔直接定义数组

arr=(10 20 30 40 50)
arr1=('zhangsan' 'lisi' 'wangwu')

方法2

 指定元素下标定义,若跳过元素不设置会显示为空

arr=([0]=10 [1]=20 [2]=30 [3]=40 [4]=50)

方法3

 字符串左右加上( )转换为数组

str="10 20 30"
arr=($list)

方法4

指定元素下标定义,若跳过元素不设置会显示为空

arr[0]=10
arr[1]=20
arr[2]=30

FOR循环快速定义数组

a=0 #下标
for i in 10 20 30 40 50
do
   array[$a]=$i
   let a++
done

echo ${array[*]}

数组输出

数组的输出不能像变量一样 echo $array ,这样只能输出第一个元素。

echo ${array[*]}
echo ${array[@]}

 配合awk命令获取列表最后一个元素

echo ${array[*]} | awk '{print $NF}' #输出所有数组内容 $NF筛选最后一个元素
#赋值给变量
last=$( echo ${array[*]} | awk '{print $NF}' )

数组长度统计

echo ${#array[*]}
echo ${#array[@]}

 若数组中有下标被跳过没有赋值,统计的长度(有值的下标)会与数组总长度不相同!

[xue@xue ~]$ arr1=([0]=10 [1]=20 [2]=30 [3]=40 [4]=50)
[xue@xue ~]$ echo ${#arr1[*]}
5

[xue@xue ~]$ arr=([0]=10 [1]=20 [2]=30 [4]=50)
[xue@xue ~]$ echo ${#arr[*]}
4

显示有值的数组下标

echo ${!array[*]}
echo ${!array[@]}
[xue@xue ~]$ arr=([0]=10 [1]=20 [2]=30 [4]=50)
[xue@xue ~]$ echo ${!arr[*]}
0 1 2 4

获取最后一个下标

array=(10 20 30 40 50)

#使用分片通配符方式
xiabiao=${!array[*]} #获取全部下标
echo ${xiabiao##* } #从前向后删到剩最后一个下标

#也可以使用AWK获取最后一段的方式
echo ${!array[*]} | awk '{print $NF}'

根据下标获取元素值

echo ${array[0]}
echo ${array[1]}
echo ${array[2]}

数组遍历

for i in ${array[*]}
do
  echo $i
done

数组切片

${arr[@]:下标:长度}    数组切片,获取从数组的某个下标开始的多少个元素
[xue@xue ~]$ array=(a b c d e 1 2 3 4 5)
[xue@xue ~]$ echo ${array[*]:6:3}
2 3 4

数组替换

${arr[*]/旧字符/新字符}  

arr= ( ${arr[*]/旧字符/新字符} )  
#重新赋值,写入变量

注意 替换会将所有匹配到的字符都替换掉

并且替换不会对变量重新赋值,只有将替换后的结果重新赋值给变量才能改变变量值

[xue@xue ~]$ array=(10 50 100 150 1000)
[xue@xue ~]$ echo ${array[*]/10/666}  
666 50 6660 150 66600 

array= ( ${array[*]/10/666} )  #重新赋值,写入变量

删除数组

unset  array          #删除数组
unset  array[1]    #删除数组下标为1的元素

数组追加元素

方法1

设置指定下标的值

arr[ 下标 ] = 值
arr[ 1 ] = 20

方法2

 直接用数组长度作为下标,表示在尾部追加

arr[ 数组长度 ] = 值
arr[ ${#arr[*]} ] = 20

方法3

最简单的方法 arr += 10

arr += (值1 值2 ...)
arr += (60 70 80 90 100)

方法4

直接重新定义数组,使用数组原先的值加上需要添加的值

双引号不能省略!

否则在数组arr中带空格的元素(“zhang san”)会被拆分成(“zhang” “san”)

不能将 @ 替换为 * !
${array[*]} ${array[@]}在未加双引号时同义,都表示所有元素
但加双引号时, arr=("${arr[
*]}") 会将数组所有元素视为同一个元素添加进数组中

arr=("${arr[@]}" "值1" "值2" ...)
arr=("${arr[@]}" "100" "200" ...) 

向函数传入数组

如果数组变量作为函数参数直接传参,函数只会得到数组第一个值(t1

解决这个问题可以将数组变量值分解为单个的值,然后将这些值作为函数使用。在函数内部,再组合成一个新的数组变量。

  1. ${array[@]}               拆分为单个值
  2. ( $@ )       (`echo $@`)       $(echo $@)  将传来的值用括号重新组合数组
t1 () {
    echo "t1接收到的参数列表:$@ "
    newarray1=($@)  #传参方法1 直接用括号包含传来的单个元素重新组成数组
    echo "t1新数组的值 ${newarray1[@]} "
}

t2 () { #传参方法2 (`echo $@`) 或$(echo $@)得到echo执行的结果再用括号包含重新组成数组
    echo "t2接收到的参数列表:$@ "
    newarray2=($(echo $@))  
    echo "t2新数组的值 ${newarray2[@]} "
}

array=(10 20 30 40 50)
echo "原始数组为 ${array[@]}"

#直接传参 数组 只能得到第一个数据
t1 $array
t2 $array 
#分解成单个值重新组合 正常显示
t1 ${array[@]}
t2 ${array[@]} 


[xue@xue ~]$ sh 12.sh

原始数组为 10 20 30 40 50

t1接收到的参数列表:10
t1新数组的值 10
t2接收到的参数列表:10
t2新数组的值 10

t1接收到的参数列表:10 20 30 40 50
t1新数组的值 10 20 30 40 50
t2接收到的参数列表:10 20 30 40 50
t2新数组的值 10 20 30 40 50

向函数传入数组并从函数返回数组

  1. ${array[@]}            拆分为单个值
  2. newarray=(`echo $@`)  、newarray=( $@) 、newarray=($(echo $@)) 传参进去重新组合
  3. echo ${newarray[*]}     传参出来

result1 = ( `  函数名  ${array[*]}  ` )  执行结果给参数赋值

t1 () {
    newarray=(`echo $@`) #重新拼接

    sum=0
    for value in ${newarray[*]} #求和
    do
        sum=$[$sum + $value]
    done
    echo $sum
}

t2 () {
    newarray=(`echo $@`)
    for ((i=0;i<=$[$# -1 ];i++)) #下标从0开始,比计数少1 
    {
        newarray[$i]=$[${newarray[$i]} *2 ] #x2
    }
    echo ${newarray[*]}
}

array=(10 20 30 40 50)
echo "原始数组为 ${array[@]}"

result1=(`t1 ${array[*]}`)
result2=(`t2 ${array[*]}`)
echo "新数组的和为 $result1 "
echo "新数组的值为 ${result2[*]} "
[xue@xue ~]$ sh 115.sh
原始数组为 10 20 30 40 50
新数组的和为 150
新数组的值为 20 40 60 80 100

冒泡排序

  • 大循环根据列表中存在的元素数量循环n次,保证所有元素都能被排序完成
    • 小循环从前向后遍历,循环一次循环范围减少一位(由于后面的已经排列完成无需再比较)
    • 小循环每次循环向后移一位并进行比较,当遇到比自己小的数交换位置,保证每轮都能获取到最大的数排列到队尾

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

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

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

##### main #####
read -p "请输入一组列表:" num
array=($num)
echo "旧数组的值为: ${array[@]}"

MAOPAO ${array[@]}
[xue@xue ~]$ sh maopao.sh
请输入一组列表:10 5 9 41 62 4 2 84 6 42 66
旧数组的值为: 10 5 9 41 62 4 2 84 6 42 66
冒泡排序后的数组的值为: 2 4 5 6 9 10 41 42 62 66 84

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

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

相关文章

Python 密码破解指南:10~14

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 十、加…

震惊!如果患上植物神经紊乱,就会诱发胃肠神经功能紊乱!

植物神经系统和胃肠系统是人体内重要的调节系统&#xff0c;它们分别负责着许多生物过程的调控。当这两个系统出现紊乱时&#xff0c;会对人体健康产生不良影响。本文将从植物神经紊乱与胃肠神经功能紊乱的关系、症状、治疗办法和生活预防方法四个方面进行探讨。 一、植物神经紊…

GoAccess 网站日志分析

GoAccess是一个开源且免费的网站日志分析和交互式WEB日志查看器&#xff0c;可在 Linux 系统的终端中或通过浏览器运行。使用它可让系统管理员视化的查看统计报告&#xff0c;这对于SEO以及运维来说非常有价值。 GoAccess支持几乎所有Web 日志格式&#xff0c;包含&#xff1a;…

数据结构-图的遍历和应用(DAG、AOV、AOE网)

目录 *一、广度优先遍历(BFS) 广度优先生成树 广度优先生成森林 *二、深度优先遍历 深度优先生成树 深度优先生成森林 二、应用 2.1最小生成树 *Prim算法 *Kruskal算法 2.2最短路径 *BFS算法 *Dijkstra算法 *Floyd算法 *2.3有向无环图(DAG网) *2.4拓扑排序(AOV网)…

Java之线程安全

目录 一.上节回顾 1.Thread类常见的属性 2.Thread类中的方法 二.多线程带来的风险 1.观察线程不安全的现象 三.造成线程不安全现象的原因 1.多个线程修改了同一个共享变量 2.线程是抢占式执行的 3.原子性 4.内存可见性 5.有序性 四.解决线程不安全问题 ---synchroni…

【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制

这一篇文章分享本人学习win32绘图编程&#xff0c;其中包括GDI绘图对象&#xff0c;绘图基础&#xff0c;基本图形的绘制&#xff0c;画笔画刷的使用&#xff0c;文本绘制&#xff0c;以及文本字体的更改。 文章目录 一.绘图基础1.BeginPaint函数2.EndPaint函数3.颜色的使用 二…

8 集群管理

8 集群管理 8.1 集群结构 ES通常以集群方式工作&#xff0c;这样做不仅能够提高 ES的搜索能力还可以处理大数据搜索的能力&#xff0c;同时也增加了系统的容错能力及高可用&#xff0c;ES可以实现PB级数据的搜索。 下图是ES集群结构的示意图&#xff1a; 从上图总结以下概念…

SSM整合详细教学(下)

SSM整合详细教学&#xff08;下&#xff09; 五、SSM整合页面开发1 准备工作2 列表查询功能3 添加功能4 修改功能5 删除功能 六、拦截器1 拦截器简介问题导入1.1 拦截器概念和作用1.2 拦截器和过滤器的区别 2 入门案例问题导入2.1 拦截器代码实现【第一步】定义拦截器【第二步】…

从零开始搭建高效的文件服务器:FastDFS与Nginx完美结合,内网穿透实现公网访问

目录 前言 1. 本地搭建FastDFS文件系统 1.1 环境安装 1.2 安装libfastcommon 1.3 安装FastDFS 1.4 配置Tracker 1.5 配置Storage 1.6 测试上传下载 1.7 与Nginx整合 1.8 安装Nginx 1.9 配置Nginx 2. 局域网测试访问FastDFS 3. 安装cpolar内网穿透 4. 配置公网访问…

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 进阶版 基础版 基本介绍 MATLAB实现QRBiLS…

C语言介绍

C语言的简洁 C语言仅有32个关键字、9种控制语句、34种运算符即可实现无数的功能。 关键字 可省略的关键字&#xff1a;auto、extern、signed. 复合类型的关键字&#xff1a;enum、struct、union. include include表示导入&#xff0c;include可以导入任意的文件。 比如#in…

Windows消息,消息循环的处理,消息队列,键盘消息,鼠标消息,定时器消息

上一章节中我们带大家编写了第一个Windows程序&#xff0c;并且带大家学习了注册窗口&#xff0c;创建窗口&#xff0c;这一章中我们来学习Windows消息&#xff0c;学习对消息循环处理的原理&#xff0c;并且带领大家学习一些常见的消息。 文章目录 一.消息基础1.消息概念及其作…

AOF 持久化详解

文章目录 AOF 相关配置AOF 文件的修复AOF 文件格式RESP 协议查看 AOF 文件清单文件 AOF RewriteRewrite 策略手动Rewrite自动Rewrite AOF 持久化过程AOF优缺点AOF与RDB混合持久化 AOF (Append Only File) 是把所有对内存进行修改的指令&#xff08;写操作&#xff09;以独立日志…

《花雕学AI》用AI创造清晨的美好:ChatGPT+DALL-E 2 生成“早上好”的场景图

早晨是一天中最美好的时刻&#xff0c;也是最适合与AI对话的时刻。想象一下&#xff0c;当你醒来&#xff0c;打开手机&#xff0c;就能看到一个AI为你生成的“早上好”的场景图&#xff0c;是不是很温馨&#xff1f;这就是ChatGPTDALL-E 2&#xff08;新Bing&#xff09; 的魅…

Elevate:全世界最小的介入泵,融资五千万美金

近日&#xff0c;以色列医疗器械公司Magenta Medical宣布完成5500万美元的C轮融资&#xff0c;该公司主要产品Elevate是目前全球最小的心脏介入泵&#xff0c;主要用于治疗急性心力衰竭患者和高危PCI的辅助。该泵采用了创新的设计和材料&#xff0c;可以通过桡动脉插入&#xf…

哪款远程控制软件可以远程玩游戏?

远程控制软件可以让你在不同设备之间进行远程控制。许多人可能会想知道&#xff0c;哪款远程控制软件可以在远程玩游戏时享受更好的游戏体验。 首先&#xff0c;在寻找适合远程游戏的远程控制软件之前&#xff0c;我们需要知道什么是远程游戏和远程控制。 远程游戏是一种允许玩…

第十二章_Redis单线程 VS 多线程

Redis为什么选择单线程&#xff1f; 是什么 这种问法其实并不严谨&#xff0c;为啥这么说呢? Redis的版本很多3.x、4.x、6.x&#xff0c;版本不同架构也是不同的&#xff0c;不限定版本问是否单线程也不太严谨。 1 版本3.x &#xff0c;最早版本&#xff0c;也就是大家口口相…

一文读懂 DNS 解析

导读 文章为“一文读懂域名与网站系列”第二篇&#xff0c;上篇文章主要介绍了域名的注册、建站和管理&#xff0c;通过本文你可以了解以下几个问题&#xff1a; 域名的结构、常用解析记录的类型 DNS 解析的过程 DNS 解析拓展知识 众所周知&#xff0c;互联网中的地址其实是…

想让行车记录仪协助道路病害自动化检测?可以!

针对【RGB3DS道路表观病害信息智慧检测系统】&#xff0c;我们着重介绍过其与道路检测车做集成预装或者处理道路检测车数据的极大便利&#xff0c;其中之一便是可高效输出带有道路检测车桩号标记的病害报表&#xff0c;这是因为道路检测车数据本身具有规范性。 那么如果使用道…

Linux(类Unix)系统可执行程序ELF文件格式详解

我们知道一个Linux程序饱和程序代码和初始数据&#xff0c;那么这些程序二进制代码和初始数据在可执行程序文件中是怎么进行存储呢&#xff1f;这便是ELF文件格式要解决的问题。 一个Linux执行程序的内存结构粗略可划分为 代码段、数据段、BSS、堆、栈&#xff0c;如下图所示&…