【Shell】shell编程之数组

目录

一、数组的概念

二、数组定义方法

三、数组

1.获取数组长度

2.获取数组数据列表

3.获取数组下标列表

4.读取某下标赋值

5.数组遍历

6.数组切片

7.数组替换

8.数组删除

四、数组追加元素

五、向函数传数组参数

​编辑六、数组排序算法

1.冒泡排序

2.直接选择排序

3.反转排序


一、数组的概念

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

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

二、数组定义方法

(30 20 10 60 50 40)
  0  1  2  3  4  5
  
方法一:
数组名=(value0 value1 value2 ...)

#以空格间隔,如果值为字符类型,需要加单引号或双引号数组名=(value0 value1 value2 ...)

方法二:
数组名=([0]=value [1]=value [2]=value ...)

#以空格间隔,“ [ ] ”里表示元素的下标,第一个元素从0开始数组名=([0]=value [1]=value [2]=value ...)

方法三:
列表名="value0 value1 value2 ..."
数组名=($列表名)

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

方法四:
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"

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

数组包括的数据类型
●数值类型
●字符类型
使用" "或' '定义

三、数组

1.获取数组长度

arr_number=(1 2 3 4 5)
arr_length=${#arr_number[*]}
           ${#arr_number[@]}
           
echo $arr_length


2.获取数组数据列表

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

3.获取数组下标列表

echo ${!arr_number[*]}

4.读取某下标赋值

arr_index2=${arr_number[2]}
echo $arr_index2

5.数组遍历

#!/bin/bash
arr_number=(1 2 3 4 5)
for v in ${arr_number[@]}
do
echo $v
done

6.数组切片

arr=(1 2 3 4 5)
echo ${arr[@]}            #输出整个数组

echo ${arr[@]:0:2}        #获取 ${数组名[@或*]:起始位置:长度} 的值

echo ${arr1[*]:1:3}

echo ${arr[@]:2:3}

7.数组替换

arr=(1 2 3 4 5)

echo ${arr[@]/4/66}     #${数组名[@或*]/查找字符/替换字符}
echo ${arr[@]}            #并不会替换数组原有内容

arr=(${arr[@]/4/66})    #要实现改变原有数组,可通过重新赋值实现
echo ${arr[@]}

8.数组删除

arr=(1 2 3 4 5)
unset arr                #删除数组
echo ${arr[*]}

arr=(1 2 3 4 5)
unset arr[2]            #删除第三个元素
echo ${arr[*]}

四、数组追加元素

方法一:

array_name[index]=value

方法二:

array_name[${#array_name[@]}]=value

方法三:

array_name=("${array_name[@]}" value1 ... valueN)
双引号不能省略,否则,当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个
不能将“@”替换为“*”,如果替换为“*”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中

for i in "${array_name[@]}"; do echo $i; done

方法四:

array_name+=(value1 ... valueN)
待添加元素必须用“()”包围起来,并且多个元素用空格分隔

[root@localhost ~]# array1=(10 20 30 40 50)
[root@localhost ~]# echo ${array1[*]}
10 20 30 40 50
[root@localhost ~]# echo ${!array1[@]}
0 1 2 3 4
[root@localhost ~]# array1[5]=60
[root@localhost ~]# echo ${!array1[@]}
0 1 2 3 4 5
[root@localhost ~]# echo ${array1[*]}
10 20 30 40 50 60

五、向函数传数组参数

如果将数组变量作为函数参数,函数只会取数组变量的第一个值。

test1() {
  echo "接收到的参数列表:$@"
  newarrary=($1)
  echo "新数组的值为:${newarrary[*]}"
}

array=(3 2 1 4 5)
echo "原始数组的值为:${array[*]}"
test1 $array


解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。

test2() {
  newarrary=($(echo $@))
  echo "新数组的值为:${newarrary[*]}"

}

array=(3 2 1 4 5)
echo "原始数组的值为:${array[*]}"
test2 ${array[*]}

从函数返回数组

test2() {
  newarrary=($@)

  sum=0
  for value in ${newarrary[*]}
  do
    sum=$[$sum + $value]
  done
  echo $sum
}

test3() {
  newarrary=(`echo $@`)
  for ((i=0; i<=$[$# - 1]; i++))
  {
    newarrary[$i]=$[${newarrary[$i]} * 2]
  }
  echo ${newarrary[*]}
}

array=(3 2 1 4 5)
echo "原始数组的值为:${array[*]}"
result1=`test2 ${array[*]}`
echo "新数组的和为:$result1"

result2=(`test3 ${array[*]}`)
echo "新数组的值为:${result2[*]}"

[root@localhost ~]# vim 14.sh#!/bin/bashtest1() {echo "函数接收到的参数列表:$@"
}arr1=(50 40 30 20 10)test1 $arr1[root@localhost ~]# bash 14.sh
函数接收到的参数列表:50[root@localhost ~]# vim 14.sh#!/bin/bashtest1() {echo "函数接收到的参数列表:$@"
}arr1=(50 40 30 20 10)test1 ${arr1[@]}


六、数组排序算法

1.冒泡排序

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

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

算法思路
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

#!/bin/bash
array=(63 4 24 1 3 15)
echo "old_array:${array[*]}"
length=${#array[*]}
#定义比较轮数,比较轮数为数组长度减1,从1开始
for ((i=1; i<$length; i++))
do#确定比较元素的位置,比较相邻两个元素,较大的数往后放,比较次数随比较轮数而减少for ((j=0; j<$length-i; j++))do#定义第一个元素的值first=${array[$j]}#定义第二个元素的值k=$[$j+1]second=${array[$k]}#如果第一个元素比第二个元素大就互换if [ $first -gt $second ]then#把第一个元素值保存到临时变量中temp=$first#把第二个元素值赋给第一个元素array[$j]=$second#把临时变量(也就是第一个元素原值)赋给第二个元素array[$k]=$tempfidone
done
#输出排序后的数组
echo "new_array:${array[*]}"

2.直接选择排序

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

基本思想:
将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。

#!/bin/bash
array=(63 4 24 1 3 15)
length=${#array[*]}
#定义排序轮数
for ((i=1; i<$length; i++))
doindex=0#确定用于比较的第一个元素的索引范围for ((j=1; j<=$length-i; j++))do#通过比较获取最大值元素的索引位置if [ ${array[$j]} -gt ${array[$index]} ];thenindex=$jfidone#获取每轮最后一个元素的索引 last=$[$length-$i]#把当前轮次的最后一个元素的值保存在临时变量中temp=${array[$last]}#把最大的元素的值赋给最后一个元素array[$last]=${array[$index]}#把原最后一个元素的值赋给原最大值的位置的元素array[$index]=$temp
doneecho ${array[*]}

3.反转排序

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

基本思想:
把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换。

#!/bin/bash
array=(10 20 30 40 50 60)
length=${#array[*]}
for ((i=0; i<$length/2; i++))
dotemp=${array[$i]}array[$i]=${array[$length-$i-1]}array[$length-$i-1]=$temp
doneecho ${array[*]}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计hadoop+hive+hbase学情分析 在线教育大数据 课程推荐系统 机器学习 深度学习 人工智能 大数据毕业设计 知识图谱

毕 业 设 计&#xff08;论 文&#xff09;开 题 报 告 1&#xff0e;结合毕业设计&#xff08;论文&#xff09;课题情况&#xff0c;根据所查阅的文献资料&#xff0c;每人撰写不少于1000字的文献综述&#xff1a; 一、研究背景和意义 “互联网”和大数据带来了网络教育的蓬…

Google:站长移除无效网址

当您的网址不需要呈现在Google站长中时&#xff0c;您可以在站长工具中移除网址 操作步骤&#xff1a;登录Google站长&#xff0c;绑定网站完成后&#xff0c;点击左侧删除 >> 输入网址 如果遇到一些网址&#xff0c;可以找寻网址间的规律&#xff0c;比如说&#xff0…

16.投影矩阵,最小二乘

文章目录 1. 投影矩阵1.1 投影矩阵P1.2 投影向量 1. 投影矩阵 1.1 投影矩阵P 根据上节知识&#xff0c;我们知道当我们在解 A X b AXb AXb的时候&#xff0c;发现当向量b不在矩阵A的列空间的时候&#xff0c;我们希望的是通过投影&#xff0c;将向量b投影到矩阵A的列空间中&…

每日一题13:Pandas:方法链

一、每日一题 &#xff1b;&#xff1a;&#xff1a; 解答&#xff1a; import pandas as pddef findHeavyAnimals(animals: pd.DataFrame) -> pd.DataFrame:heavy_animals animals[animals[weight] > 100].sort_values(byweight, ascendingFalse)result heavy_anim…

小红书“脆皮”用户健康研究报告

人均脆皮、血脉觉醒、爆肝打工、脱发危机……各式各样的健康议题不断被推上生活舞台&#xff0c;年轻人纷纷自嘲&#xff1a;“20多岁的年纪&#xff0c;却有了60多岁的身体”。 近年&#xff0c;大健康行业欣欣向荣&#xff0c;小红书成为大众分享健康生活的聚集地&#xff0c…

yolov8使用与训练步骤

第一&#xff1a;安装miniconda 网址&#xff1a;Index of /anaconda/miniconda/ 登录网址后 在网页按ctrF 输入&#xff1a;搜py38 Miniconda3-py38_22.11.1-1-Windows-x86_64.exe 52.5 MiB 2022-12-23 07:57 下载进行安装 安装过程中记得加环境变量这个项。 第二…

[AI开发配环境]jupyter notebook远程连接ssh

照这个操作&#xff1a; https://blog.csdn.net/wuqrcn/article/details/135512396 步骤 安装并生成配置文件 注意&#xff0c;在base环境中安装&#xff0c;这样在其他所有环境中都能用&#xff0c;到时候选环境即可。 pip install jupyter notebook # 安装jupyter notebo…

WPF 鼠标拖拽平移

效果 xaml <ScrollViewer x:Name"scrollViewer" HorizontalScrollBarVisibility"Hidden" VerticalScrollBarVisibility"Disabled" Background"#FFF1ADAD"PreviewMouseDown"ScrollViewer_OnPreviewMouseDown"PreviewMou…

2023年数维杯国际大学生数学建模挑战赛D题洗衣房清洁计算解题全过程论文及程序

2023年数维杯国际大学生数学建模挑战赛 D题 洗衣房清洁计算 原题再现&#xff1a; 洗衣房清洁是人们每天都要做的事情。洗衣粉的去污作用来源于一些表面活性剂。它们可以增加水的渗透性&#xff0c;并利用分子间静电排斥机制去除污垢颗粒。由于表面活性剂分子的存在&#xff…

现代加密技术(对称和非对称加密)

1.分类 现代加密技术&#xff1a;对称和非对称加密&#xff0c;对称加密即共享密钥&#xff0c;非对称加密是公钥加密算法。 2.基础总结 AES是什么算法&#xff1f; 分组加密算法&#xff0c;对称加密算法AES的分组长度是&#xff1f;固定128位AES密钥长度是多少&#xff1f;支…

(五)Spring教程——Spring IoC容器(上)

在Spring框架中&#xff0c;Bean的实例化和组装都是IoC容器配置元数据完成的。Spring框架提供的容器主要是基于BeanFactory和ApplicationContext两个接口&#xff0c;一种是实现BeanFactory接口的简单容器&#xff0c;另一种是实现ApplicationContext接口的高级容器。 BeanFact…

Qwen学习笔记3:Qwen模型调用外部API实现模型增强(openai的形式)

前言 本文记录了使用本地部署的Qwen模型&#xff0c;调用外部API实现模型的功能增强&#xff0c;非常的易用&#xff0c;大家用于开发自己的应用&#xff0c;只需要作简单的修改就可以进行使用了。 本文的代码来源视频教程&#xff1a; Qwen大模型变强了&#xff0c;通过API…