目录
有这样一个现实问题:一个班级学员信息系统,要求存储学员ID、NAME、SCORE、AGE、GENDER,班级有50个人,思考如何解决交互中数据存储的问题。很多人可能直接说或定义变量接收数据不就行了!nice,你很棒!!
解决方案如下:
1)每个学生通过5个变量,一个班级50个学生,5*50=250,妥妥的!我定义250个变量接收就可以了,美美哒!
兄弟,现在不是全班了是全校的学生需要录入你这个信息系统,你写变量吧!!当我提出这个需求的时候,作为开发你会不会想骂娘呢?
2)使用数组来定义,我只需要定义5个数组来接收所有用户的数据就可以了,5个数组就能解决一切,你觉得你会不会想了解下数组是什么呢?
数组可以让用户一次赋予多个值,需要读取数据时只需通过索引调用就可以方便读出了。
数组名称=(元素1 元素2 元素3 ...)
- 变量名(数组名称)=变量值
- array[0]=v1
- array[1]=v2
- array[3]=v3
- array=(var1 var2 var3 var4)
- array1=(`cat /etc/passwd`) // 将 passwd 文件中每一行赋值给array1数组
- array2=(`ls /root`)
- array3=(harry amy jack "Miss zhang")
- array4=(1 2 3 4 "hello world" [10]=linux)
- # 一次赋予多个值
- array1=(a b c d e f g)
-
- # 分别赋值
- array2[0]=1
- array2[1]=2
- array2[10]=11
-
- # 命令的执行结果赋值
- array3=(`cat /etc/passwd`)
-
- # 个性化diy赋值
- array4=(1 2 3 "hello world" [8]="haha")
取值方式: ${数组名称[索引]}
索引: 默认情况下索引是指数组中的元素[存的值]在数组中的顺序,从0开始计数,关联数组除外。
比如:
array=(var1 var2 var3 var4)
array数组中存有4个元素,分别是:var1 var2 var3 var4
那么我想取出var2这个元素,那么就得先看看他在数组中的位置,数组中的元素索引如下:
- 元素 var1 var2 var3 var4
- 索引 0 1 2 3
所以正确表示array数组中元素var2的方式是:${array[1]}
数组取值的多种方式:
- ${array[i]} i表示元素的索引
- 使用 @ 或 * 可以获取数组中的所有元素:
-
- echo ${array[0]} 获取第一个元素
- echo ${array[*]} 获取数组里的所有元素
- echo ${#array[*]} 获取数组里所有元素个数
- echo ${!array[@]} 获取数组元素的索引
- echo ${array[@]:1:2} 获取指定的元素范围。1代表从索引为1的元素开始获取;2代表获取1索引及其后面的元素总共2个元素
- [root@shell ~]# vi array_test.sh
- #!/bin/bash
-
- # 一次赋予多个值
- array1=(a b c d e f g)
-
- # 分别赋值
- array2[0]=1
- array2[1]=2
- array2[10]=11
-
- # 命令的执行结果赋值
- array3=(`cat /etc/passwd`)
-
- # 个性化diy赋值
- array4=(1 2 3 "hello world" [8]="haha")
-
- # 取值 ${数组名[索引]}
- echo ${array1[2]}
- echo ${array2[1]}
- echo ${array3[0]}
- echo ${array4[8]}
-
- # 获取array2中的所有元素
- echo ${array2[*]}
-
- # 获取array2中所有元素个数
- echo ${#array2[*]}
-
- # 获取array2数组元素的索引
- echo ${!array2[@]}
-
- # 获取指定的元素范围
- echo ${array1[*]:2:3}
-
- [root@shell ~]# sh array_test.sh
- c
- 2
- root:x:0:0:root:/root:/bin/bash
- haha
- 1 2 11
- 3
- 0 1 10
- c d e
关联数组使用首先需要申明该数组为关联数组,申明方式: declare -A 数组名称
- # 声明关联数组
- [root@shell ~]# declare -A asso_array1
- [root@shell ~]# declare -A asso_array2
- # 数组名[索引名称]=变量值
- [root@shell ~]# asso_array1[linux]=one
- [root@shell ~]# asso_array1[java]=two
- [root@shell ~]# asso_array1[php]=three
asso_array2=([name1]=harry [name2]=jack [name3]=amy [name4]="Miss zhang")
- [root@shell ~]# declare -A
- declare -A asso_array1='([php]="three" [java]="two" [linux]="one" )'
- declare -A asso_array2='([name3]="amy" [name2]="jack" [name1]="harry" [name4]="Miss zhang" )'
- # 指定索引取值
- [root@shell ~]# echo ${asso_array1[linux]}
- one
- [root@shell ~]# echo ${asso_array1[php]}
- three
-
- # 去除数组所有值
- [root@shell ~]# echo ${asso_array1[*]}
- three two one
- [root@shell ~]# echo ${!asso_array1[*]}
- php java linux
-
- # 统计数组元素个数
- [root@shell ~]# echo ${#asso_array1[*]}
- 3
- [root@shell ~]# echo ${#asso_array2[*]}
- 4
-
- # 取出数组所有元素的索引
- [root@shell ~]# echo ${!asso_array2[*]}
- name3 name2 name1 name4
写一个监控CPU 平均负载值的脚本
案例需求
分别打印 CPU 1min 5min 15min load 负载值
案例思路
案例步骤
代码实现
- [root@shell ~]# cat cup_load.sh
- #!/bin/bash
-
- #1、收集负载值
- cpu_load=(`uptime|tr -s " "|cut -d " " -f9-11|tr "," " "`)
-
- #2、输出负载值
- echo "CPU 1 min 平均负载为: ${cpu_load[0]}"
- echo "CPU 5 min 平均负载为: ${cpu_load[1]}"
- echo "CPU 15 min 平均负载为: ${cpu_load[2]}"
代码效果

上一篇文章:【Shell 脚本速成】05、Shell 运算详解_Stars.Sky的博客-CSDN博客
参考文章:shell 数组详解-组团学