shell编程之数组(下)

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


方法3示例:数组名[数组长度]=元素值

[root@yuji ~]# echo ${cc[@]}
 10 20 30 40 50
 [root@yuji ~]# cc[${#cc[@]}]=60         //"${#cc[@]"可以获取数组长度
 [root@yuji ~]# echo ${cc[@]}
 10 20 30 40 50 60
复制代码


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


方法4示例:数组名=("${数组名[@]}" 元素1 元素2 .....)

#示例1
 [root@yuji ~]# b=(1 2 3)
 [root@yuji ~]# echo ${b[@]}
 1 2 3
 [root@yuji ~]# b=("${b[@]}" 7 8)     //引用数组的所有元素值一定要使用$@,因为加上双引号之后"$@"表示将所有参数当作个体
 [root@yuji ~]# echo ${b[@]}
 1 2 3 7 8
 [root@yuji ~]# echo ${#b[@]}       //数组长度为5
 5
 [root@yuji ~]# b=("${b[*]}" 9)      //如果使用$*,那么数组内的所有元素会被当作一个整体,即被当成一个元素
 [root@yuji ~]# echo ${b[@]}
 1 2 3 7 8 9
 [root@yuji ~]# echo ${#b[@]}       //数组长度为2
 2
 #示例2
 [root@yuji ~]# e=("li si")           //当元素类型为字符时,一定要加引号,避免单个元素中有空格被当成2个元素
 [root@yuji ~]# echo ${e[@]}
 li si
 [root@yuji ~]# echo ${#e[@]}
 1
 [root@yuji ~]# e=("${e[@]}" "wang wu" "zhao liu")      //引用数组的元素值时一定要使用双引号,因为单引号无法引用变量值
 [root@yuji ~]# echo ${e[@]}
 li si wang wu zhao liu
 [root@yuji ~]# echo ${#e[@]}
 3
复制代码


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


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



4.5 使用for遍历输出数组的每个元素值

1、通过数组内的所有元素来遍历。

[root@yuji ~]# arr=(30 20 40 10 50)
 [root@yuji ~]# echo ${arr[@]}
 30 20 40 10 50
 [root@yuji ~]# for i in ${arr[@]};do echo $i;done
 30
 20
 40
 10
 50
复制代码


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


2、通过下标值来遍历,这种方法可能会由于数组内元素不完整,某个下标对应的元素值为空。

[root@yuji ~]# echo ${arr[@]}
 30 20 40 10 50
 [root@yuji ~]# length=${#arr[@]}
 [root@yuji ~]# for ((i=0;i<=length-1;i++))
 > do
 > echo ${arr[$i]}
 > done
 30
 20
 40
 10
 50
复制代码


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


4.6 查看所有的数组

命令:declare -a

[root@yuji ~]# declare -a       //查看所有的数组
 declare -a BASH_ARGC='()'
 declare -a BASH_ARGV='()'
 declare -a BASH_LINENO='()'
 declare -a BASH_SOURCE='()'
 declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
 declare -a DIRSTACK='()'
 declare -a FUNCNAME='()'
 declare -a GROUPS='()'
 declare -a PIPESTATUS='([0]="0")'
 declare -a arr='([0]="30" [1]="20" [2]="40" [3]="10" [4]="50")'
 declare -a arr2='([0]="10" [1]="20" [2]="200" [3]="40")'
 declare -a b='([0]="1 2 3 7 8" [1]="9")'
 [root@yuji ~]# declare -a | grep "b"       //过滤出数组b
 declare -a b='([0]="1 2 3 7 8" [1]="9")'
复制代码


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

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


5 将数组的值传给函数


操作步骤:

第一步:向函数传入数组的时候需要先把数组转换成列表作为函数的参数使用:
 函数名 ${数组名1[@]}
 第二步:在函数内把传入的列表重新组合成数组:
 数组名2=($@)
 第三步:在函数外重新组合成数组:
 数组名3=(`函数名 ${数组名1[@]}`)
复制代码


示例1:获取数组的数据列表作为函数的参数使用

#!/bin/bash
 fun01 () {
 #不能写$1,否则只会输出数组的第一个元素
    echo "函数接收到的参数为:$@"
 #在函数内把传入的列表重新组合成数组
    newarr=($@)
    echo "新数组的值为:${newarr[@]}"
 }
 #### main ####
 arr=(1 2 3 4 5)
 echo "原数组的值为:${arr[@]}"
 #把数组转换成列表作为函数的参数使用
 fun01 ${arr[@]}
复制代码


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


示例2:使用for循环,令新数组内的每个元素值乘2

方法一:i<=数组长度减1

#!/bin/bash
 fun02 () {
 #在函数内把传入的列表重新组合成数组
    newarr=($@)
    echo "新数组的值为:${newarr[@]}"
 # ${#newarr[@]} 为数组的长度
    for ((i=0;i<=${#newarr[@]}-1;i++))
    do
       newarr[$i]=$[${newarr[$i]}*2]
    done
    echo "每个元素值翻倍后为:${newarr[@]}"
 }
 #### main ####
 arr=(1 2 3 4 5)
 echo "原数组的值为:${arr[@]}"
 #把数组转换成列表作为函数的参数使用
 fun02 ${arr[@]}
复制代码


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


方法二:i<=参数个数减1

$# 表示调用函数时函数后面跟的参数个数

#!/bin/bash
 fun03 () {
 #在函数内把传入的列表重新组合成数组
    newarr=($@)
    echo "新数组的值为:${newarr[@]}"
 # $#表示调用函数时函数后面跟的参数个数
    for ((i=0;i<=$[$#-1];i++))
    do
       newarr[$i]=$[${newarr[$i]}*2]
    done
    echo "每个元素值翻倍后为:${newarr[@]}"
 }
 #### main ####
 arr=(1 2 3 4 5)
 echo "原数组的值为:${arr[@]}"
 #把数组转换成列表作为函数的参数使用
 fun03 ${arr[@]}
复制代码


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


示例3:把数组的所有元素通过函数求出累加和

把原数组的所有元素传入函数变成新数组后,再求出累加和。

vim shu1.sh
 #!/bin/bash
 myfun () {
    newarr=($@)
    sum=0
    for i in ${newarr[@]}
    do
       sum=$[sum+i]
    done
    echo "数组内所有元素的累加和是:$sum"
 }
 ##### main ######
 arr=(3 1 4 2 6 5)
 myfun ${arr[@]}
复制代码


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

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