shell编程之数组(上)

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

1 什么是数组

数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。

组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。

用于区分数组的各个元素的数字编号称为下标。元素的下标从0开始。

数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。


2 定义数组的方法

Shell中,数组用括号来表示,元素用"空格"符号分隔开。

数组包括的数据类型:

  • 数值型
  • 字符型 (如果元素值为字符类型,需要加单引号或双引号,防止单个元素中有空格被当成2个元素)
  • 混合型数值加字符

方法一:

数组名=(value1  value2 value3 value4 ...)
复制代码


方法二:

先定义列表,再引用列表的值定义数组。

列表名="value1  value2 value3 value4 value5"
 数组名=($列表名)
复制代码


方法三:

用过下标值定义每个元素。

数组名=([0]=value1  [1]=value2  [2]=value3)
复制代码


方法四:

通过下标值,一个一个定义数组内的每个元素。

同时也可以通过这种方式修改元素的值。

数组名[0]=value1
 数组名[1]=value2
 数组名[2]=value3
 数组名[3]=value4
复制代码


网络异常,图片无法展示
|


3 引用数组的值

1、获取数组的数据列表(所有元素的值)

echo ${array[@]}
 echo ${array[*]}
复制代码


网络异常,图片无法展示
|


2、查看数组内某一个元素的值

${数组名[n]}       //n代表元素的下标
 echo ${array[0]}   //获取数组内第一个元素的值(下标为0的元素值)
 echo ${array[1]}   //获取数组内第二个元素的值(下标为1的元素值)
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


3、获取数组的长度

echo ${#数组名[*]}
 echo ${#数组名[@]}
复制代码


网络异常,图片无法展示
|


4、查看数组内最后一个元素的值

方法一:

echo ${array[-1]}    //获取最后一个元素的值
 echo ${array[-2]}    //获取倒数第二个元素的值
复制代码


网络异常,图片无法展示
|


方法二:

length=${#array[@]}    //获取数组的长度
 last=$[$length-1]      //数组的长度减1
 echo ${array[$last]}   //查看最后一个元素值
 #用这种方式查看最后一个元素值,可以判断这个数组的下标是不是完整的。因为如果中间跳过了一个下标,那么此种方法无法获取最后一个元素的值。
 echo ${array[${#array[@]}]}  //查看下标值为数组长度的元素,如果没有跳过某个下标值,那么这个应该为空。如果不为空,说明跳过了某个下标值,数组下标不完整。
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


4 数组的常用操作


4.1 数组分片(数组截取)

格式:

${数组名[@]:起始位置:截取长度}        //起始位置从0算起
 ${数组名[@]}           //获取整个数组的元素值
 ${数组名[@]:0:3}      //从下标为0的元素开始截取,共截取3个元素。(即截取元素1到元素3)
 ${数组名[@]:2:2}      //从下标为2的元素开始截取,共截取2个元素。(即截取元素3到元素4)
复制代码


示例:

[root@yuji ~]# arr1=(10 20 30 40 50 60)
 [root@yuji ~]# echo ${arr1[@]}
 10 20 30 40 50 60
 [root@yuji ~]# echo ${arr1[@]:0:3}   //从下标为0的元素开始截取,共截取3个元素
 10 20 30
 [root@yuji ~]# echo ${arr1[@]:2:2}   //从下标为2的元素开始截取,共截取2个元素
 30 40
 [root@yuji ~]# echo ${arr1[@]:2:4}   //从下标为2的元素开始截取,共截取4个元素
 30 40 50 60
复制代码




网络异常,图片无法展示
|


4.2 数组元素替换

1、临时替换(不会影响原有数组)

echo ${数组名[@]/旧字符/新字符}    //会替换所有元素中能匹配到的字符,但这是临时替换,不会改变原有数组的值
复制代码


示例1:将30替换为100

[root@yuji ~]# arr2=(10 20 30 40)      //定义数组
 [root@yuji ~]# echo ${arr2[@]}         //查看数组内的所有元素
 10 20 30 40
 [root@yuji ~]# echo ${arr2[@]/30/100}     //将30临时替换为100
 10 20 60 40
 [root@yuji ~]# echo ${arr2[@]}         //不会改变原有数组内的元素值
 10 20 30 40
复制代码


网络异常,图片无法展示
|


示例2:将所有的0替换为7

[root@yuji ~]# echo ${arr2[@]}
 10 20 30 40
 [root@yuji ~]# echo ${arr2[@]/0/7}    //将所有的0替换为7
 17 27 37 47
 [root@yuji ~]# echo ${arr2[@]}        //不会改变原有数组的元素值
 10 20 30 40
复制代码


网络异常,图片无法展示
|


2、重新赋值(永久替换)

数组名=(${数组名[@]/旧字符/新字符})
复制代码


示例:将30重新赋值为200

[root@yuji ~]# echo ${arr2[@]}
 10 20 30 40
 [root@yuji ~]# arr2=(${arr2[@]/30/200})     //重新赋值
 [root@yuji ~]# echo ${arr2[@]}                   //会改变原有数组的元素值
 10 20 200 40
复制代码


网络异常,图片无法展示
|


4.3 删除数组

1、删除数组内的某个元素

unset 数组名[n]        //删除数组内的某一个元素,n为下标值
复制代码


示例:

[root@yuji ~]# echo ${aa[@]}
 10 20 30 40 
 [root@yuji ~]# unset aa[2]           //删除下标值为2的元素
 [root@yuji ~]# echo ${aa[@]}        //30已被删除
 10 20 40
复制代码


网络异常,图片无法展示
|


2、删除整个数组

unset 数组名[*]
 unset 数组名[@] 
复制代码


示例:

[root@yuji ~]# echo ${aa[@]}
 10 20 40
 [root@yuji ~]# unset aa[@]       //删除整个数组
 [root@yuji ~]# echo ${aa[@]}     //查看数组所有元素值,已为空
 [root@yuji ~]# echo ${bb[*]}
 1 2 3 4
 [root@yuji ~]# unset bb[*]        //删除整个数组
 [root@yuji ~]# echo ${bb[*]}      //查看数组所有元素值,已为空
 [root@yuji ~]#
复制代码


网络异常,图片无法展示
|


4.4 数组扩写,增加数组内的元素

当我们原本定义的数组不能满足我们的需求时,我们需要追加数组内的元素。

#方法1
 数组名[n]=元素值       //使用下标值直接增加元素
 #方法2
 数组名+=(元素1 元素2 .....)
 #方法3
 数组名[数组长度]=元素值     //此种方法必须保证数组元素是完整的,如果某个下标被跳过了,此种方法会替换掉原来的某个元素
 #方法4
 数组名=("${数组名[@]}" 元素1 元素2 .....)
//引用数组值必须加双引号,不然原数组内有空格的单个元素(例如"zhang san")会被当成2个元素。
//且必须使用@,因为加上双引号之后"$@"表示将所有参数当作个体,而$*表示将所有参数当作一个整体。
复制代码


方法1示例:数组名[n]=元素值

[root@yuji ~]# echo ${cc[@]}
 10 20 30
 [root@yuji ~]# cc[3]=40
 [root@yuji ~]# cc[4]=50
 [root@yuji ~]# echo ${cc[@]}
 10 20 30 40 50
复制代码


网络异常,图片无法展示
|


方法2示例:数组名+=(元素值)

[root@localhost ~]# echo ${a[@]}
 1 2 3 4 5
 [root@localhost ~]# a+=(6)              //增加元素值6
 [root@localhost ~]# echo ${a[@]}
 1 2 3 4 5 6
 [root@localhost ~]# a+=(7 8 9)          //增加元素值7、8、9
 [root@localhost ~]# echo ${a[@]}
 1 2 3 4 5 6 7 8 9
复制代码


网络异常,图片无法展示
|


相关文章
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
210 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
存储 Shell
Shell 数组
【10月更文挑战第16天】
204 3
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
11月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
Shell Linux 开发工具
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
232 12
|
Shell
Shell编程(下)
Shell编程(下)
194 1
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
131 1
|
Shell PHP 索引
Shell 数组
10月更文挑战第2天
94 1
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余