• 【Shell 脚本速成】06、Shell 数组详解


    目录

    一、数组介绍

    二、数组定义

    三、数组赋值方式

    四、数组取值

    案例演示

    五、关联数组

    5.1 定义管理数组

    5.2 关联数组赋值

    5.3 管理数组取值

    5.4 综合案例 


     

            有这样一个现实问题:一个班级学员信息系统,要求存储学员ID、NAME、SCORE、AGE、GENDER,班级有50个人,思考如何解决交互中数据存储的问题。很多人可能直接说或定义变量接收数据不就行了!nice,你很棒!!

    解决方案如下:

    1)每个学生通过5个变量,一个班级50个学生,5*50=250,妥妥的!我定义250个变量接收就可以了,美美哒!

            兄弟,现在不是全班了是全校的学生需要录入你这个信息系统,你写变量吧!!当我提出这个需求的时候,作为开发你会不会想骂娘呢?

    2)使用数组来定义,我只需要定义5个数组来接收所有用户的数据就可以了,5个数组就能解决一切,你觉得你会不会想了解下数组是什么呢?

    一、数组介绍

    数组可以让用户一次赋予多个值,需要读取数据时只需通过索引调用就可以方便读出了。

    • 普通数组:只能使用整数作为数组索引(元素的索引)
    • 关联数组:可以使用字符串作为数组索引(元素的索引)

    二、数组定义

    数组名称=(元素1 元素2 元素3 ...)

    三、数组赋值方式

    • 一次附一个值
    1. 变量名(数组名称)=变量值
    2. array[0]=v1
    3. array[1]=v2
    4. array[3]=v3
    • 一次附多个值
    1. array=(var1 var2 var3 var4)
    2. array1=(`cat /etc/passwd`) // 将 passwd 文件中每一行赋值给array1数组
    3. array2=(`ls /root`)
    4. array3=(harry amy jack "Miss zhang")
    5. array4=(1 2 3 4 "hello world" [10]=linux)
    • 案例演示
    1. # 一次赋予多个值
    2. array1=(a b c d e f g)
    3. # 分别赋值
    4. array2[0]=1
    5. array2[1]=2
    6. array2[10]=11
    7. # 命令的执行结果赋值
    8. array3=(`cat /etc/passwd`)
    9. # 个性化diy赋值
    10. array4=(1 2 3 "hello world" [8]="haha")

    四、数组取值

    取值方式: ${数组名称[索引]}

    索引: 默认情况下索引是指数组中的元素[存的值]在数组中的顺序,从0开始计数,关联数组除外。

    比如:
    array=(var1 var2 var3 var4)
    array数组中存有4个元素,分别是:var1 var2 var3 var4
    那么我想取出var2这个元素,那么就得先看看他在数组中的位置,数组中的元素索引如下:

    1. 元素 var1 var2 var3 var4
    2. 索引 0 1 2 3

    所以正确表示array数组中元素var2的方式是:${array[1]}

    数组取值的多种方式:

    1. ${array[i]} i表示元素的索引
    2. 使用 @ 或 * 可以获取数组中的所有元素:
    3. echo ${array[0]} 获取第一个元素
    4. echo ${array[*]} 获取数组里的所有元素
    5. echo ${#array[*]} 获取数组里所有元素个数
    6. echo ${!array[@]} 获取数组元素的索引
    7. echo ${array[@]:1:2} 获取指定的元素范围。1代表从索引为1的元素开始获取;2代表获取1索引及其后面的元素总共2个元素

    案例演示

    1. [root@shell ~]# vi array_test.sh
    2. #!/bin/bash
    3. # 一次赋予多个值
    4. array1=(a b c d e f g)
    5. # 分别赋值
    6. array2[0]=1
    7. array2[1]=2
    8. array2[10]=11
    9. # 命令的执行结果赋值
    10. array3=(`cat /etc/passwd`)
    11. # 个性化diy赋值
    12. array4=(1 2 3 "hello world" [8]="haha")
    13. # 取值 ${数组名[索引]}
    14. echo ${array1[2]}
    15. echo ${array2[1]}
    16. echo ${array3[0]}
    17. echo ${array4[8]}
    18. # 获取array2中的所有元素
    19. echo ${array2[*]}
    20. # 获取array2中所有元素个数
    21. echo ${#array2[*]}
    22. # 获取array2数组元素的索引
    23. echo ${!array2[@]}
    24. # 获取指定的元素范围
    25. echo ${array1[*]:2:3}
    26. [root@shell ~]# sh array_test.sh
    27. c
    28. 2
    29. root:x:0:0:root:/root:/bin/bash
    30. haha
    31. 1 2 11
    32. 3
    33. 0 1 10
    34. c d e

    五、关联数组

    5.1 定义管理数组

    关联数组使用首先需要申明该数组为关联数组,申明方式: declare -A 数组名称

    1. # 声明关联数组
    2. [root@shell ~]# declare -A asso_array1
    3. [root@shell ~]# declare -A asso_array2

    5.2 关联数组赋值

    • 一次赋一个值
    1. # 数组名[索引名称]=变量值
    2. [root@shell ~]# asso_array1[linux]=one
    3. [root@shell ~]# asso_array1[java]=two
    4. [root@shell ~]# asso_array1[php]=three
    • 一次附多个值
    asso_array2=([name1]=harry [name2]=jack [name3]=amy [name4]="Miss zhang")
    
    • 查看关联数组
    1. [root@shell ~]# declare -A
    2. declare -A asso_array1='([php]="three" [java]="two" [linux]="one" )'
    3. declare -A asso_array2='([name3]="amy" [name2]="jack" [name1]="harry" [name4]="Miss zhang" )'

    5.3 管理数组取值

    1. # 指定索引取值
    2. [root@shell ~]# echo ${asso_array1[linux]}
    3. one
    4. [root@shell ~]# echo ${asso_array1[php]}
    5. three
    6. # 去除数组所有值
    7. [root@shell ~]# echo ${asso_array1[*]}
    8. three two one
    9. [root@shell ~]# echo ${!asso_array1[*]}
    10. php java linux
    11. # 统计数组元素个数
    12. [root@shell ~]# echo ${#asso_array1[*]}
    13. 3
    14. [root@shell ~]# echo ${#asso_array2[*]}
    15. 4
    16. # 取出数组所有元素的索引
    17. [root@shell ~]# echo ${!asso_array2[*]}
    18. name3 name2 name1 name4

    5.4 综合案例 

    写一个监控CPU 平均负载值的脚本

    案例需求

    分别打印 CPU 1min 5min 15min load 负载值

    案例思路

    1. 如何取CPU负载值,有哪些命令
    2. 如果存储在内存中,变量、数组

    案例步骤

    1. 收集cpu load 平均负载值到数组
    2. 打印输出对应的负载值

    代码实现

    1. [root@shell ~]# cat cup_load.sh
    2. #!/bin/bash
    3. #1、收集负载值
    4. cpu_load=(`uptime|tr -s " "|cut -d " " -f9-11|tr "," " "`)
    5. #2、输出负载值
    6. echo "CPU 1 min 平均负载为: ${cpu_load[0]}"
    7. echo "CPU 5 min 平均负载为: ${cpu_load[1]}"
    8. echo "CPU 15 min 平均负载为: ${cpu_load[2]}"

    代码效果

    上一篇文章:【Shell 脚本速成】05、Shell 运算详解_Stars.Sky的博客-CSDN博客 

    参考文章:shell 数组详解-组团学

  • 相关阅读:
    成长在于积累——https 认证失败的学习与思考
    【运筹优化】基于堆优化的天际线启发式算法和复杂的评分策略求解二维矩形装箱问题 + Java代码实现
    drf之请求、drf之响应、两个视图基类、5个视图扩展类(不是视图类)、原生django,怎么写向响应头写入数据
    【八大排序算法】插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序
    Golang Copy()方法学习
    快速响应的高效多值拜占庭共识方案
    Flask 学习-55.文件上传功能开发
    运动场地预约管理系统,羽毛球场地预定系统,场地预约系统毕业设计
    Linux_进程控制
    LeetCode二叉树系列——107.二叉树的层序遍历II
  • 原文地址:https://blog.csdn.net/weixin_46560589/article/details/128077004