SHELL脚本编程-普通数组(列表)和关联数组(字典)

原文链接:https://www.cnblogs.com/yinzhengjie/p/11908834.html

一.数组相关概述

复制代码
变量:
  存储单个元素的内存空间

数组:
  存储多个元素的连续的内存空间,相当于多个变量的集合

数组名和索引
  索引:编号从0开始,属于数值索引
  注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持(关联数据使用时必须提前声明类型)
  bash的数组支持稀疏格式(索引不连续)

声明数组:
  declare -a ARRAY_NAME
  declare -A ARRAY_NAME: 关联数组
  注意:普通数组不用事先声明就可以使用,但关联数组必须提前声明才能使用,且两者不可相互转换。
复制代码
[root@node101.yinzhengjie.org.cn ~]# bash --version

二.数组赋值

1>.一次只赋值一个元素及引用数组详解

复制代码
[root@node101.yinzhengjie.org.cn ~]# declare -a title   #使用数组变量时建议提前声明
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# title[0]=CEO   #逐一对数组进行赋值
[root@node101.yinzhengjie.org.cn ~]# title[1]=COO
[root@node101.yinzhengjie.org.cn ~]# title[2]=CTO
[root@node101.yinzhengjie.org.cn ~]# title[3]=CFO
[root@node101.yinzhengjie.org.cn ~]# title[4]=devops
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo $title   #如果不加下标则默认打印数组的第一个元素。
CEO
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[1]}      #查看指定的元素下标
COO
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[3]}
CFO
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[]}          #查看数组中的所有元素
CEO COO CTO CFO devops
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[@]}          #同上
CEO COO CTO CFO devops
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]}          #查看数组的长度
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[
]}          #同上
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 70: …ngjie.org.cn ~]#̲ [root@node101…{#title[*]}]=“bigdata” #在数组的末尾添加一个元素
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[@]}
CEO COO CTO CFO devops bigdata
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# unset title[1] #删除索引为1的元素
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[@]}
CEO CTO CFO devops bigdata
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]}
5
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# unset title #删除整个数组
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]} #由于数组依旧被删除了,长度自然也就为0啦~
0
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[@]}             #内容也被随之清空了

[root@node101.yinzhengjie.org.cn ~]#
复制代码
2>.一次赋值全部元素

复制代码
[root@node101.yinzhengjie.org.cn ~]# echo ${title[@]}

[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# title=(CEO COO CTO CFO devops)        #一次性赋值多个元素
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[@]}
CEO COO CTO CFO devops
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]}
5
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# unset title
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]}
0
[root@node101.yinzhengjie.org.cn ~]#
复制代码
3>.只赋值特定元素(稀疏格式)

复制代码
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]}
0
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# title=([0]=CEO [3]=CTO [5]=devops)
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]}
3
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[]}
CEO CTO devops
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# unset title
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[
]}

[root@node101.yinzhengjie.org.cn ~]#
复制代码
4>.交互式数组值对赋值

复制代码
[root@node101.yinzhengjie.org.cn ~]# echo ${title[*]}

[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# read -a title        #通过交互式对数组title进行赋值,各个元素用空格分开即可。
CTO CEO COO CTO
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[]}
CTO CEO COO CTO
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[
]}
4
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# unset title
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[*]}
0
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]#
复制代码
5>.显示所有数组

复制代码
[root@node101.yinzhengjie.org.cn ~]# student[0]=“jason”
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# student[1]=“yinzhengjie”
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# declare -a      #显示当前shell中识别的所有数组
declare -a BASH_ARGC=‘()’
declare -a BASH_ARGV=‘()’
declare -a BASH_LINENO=‘()’
declare -ar BASH_REMATCH=‘()’
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 student=‘([0]=“jason” [1]=“yinzhengjie”)’
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]#
复制代码

三.遍历数组

复制代码
[root@node101.yinzhengjie.org.cn ~]# cat shell/title_array.sh
#!/bin/bash

#********************************************************************
#Author: yinzhengjie
#QQ: 1053419035
#Date: 2019-11-29
#FileName: shell/title_array.sh
#URL: http://www.cnblogs.com/yinzhengjie
#Description: The test script
#Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated.
#********************************************************************

declare -a title
title[0]=CEO
title[1]=COO
title[2]=CTO
title[3]=CFO
title[4]=devops

count=seq 0 $[${#title[*]}-1]

for i in $count
do
echo Title is KaTeX parse error: Expected '}', got 'EOF' at end of input: {title[i]}
done
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# bash shell/title_array.sh
Title is CEO
Title is COO
Title is CTO
Title is CFO
Title is devops
[root@node101.yinzhengjie.org.cn ~]#
复制代码

四.数组数据处理

1>.引用数组中的元素(数组切片)

复制代码
[root@node101.yinzhengjie.org.cn ~]# title=(CEO COO CTO CFO devops)      #定义数组
[root@node101.yinzhengjie.org.cn ~]# echo ${title[]}               #查看数组的内容
CEO COO CTO CFO devops
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[
]:1:2}             #跳过第一个元素并取出后续2个元素
COO CTO
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[*]:2}               #跳过前2个元素,后面的元素全都要
CTO CFO devops
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]#
复制代码
2>.向数组中追加元素

复制代码
[root@node101.yinzhengjie.org.cn ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 70: …ngjie.org.cn ~]#̲ [root@node101…{#title[*]}]=“bigdata” #在数组的末尾添加一个元素
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[@]}
CEO COO CTO CFO devops bigdata
[root@node101.yinzhengjie.org.cn ~]#
复制代码
3>.关联数组(在其它编程语言称之为"字典"或者"map")

复制代码
[root@node101.yinzhengjie.org.cn ~]# declare -a student_info        #声明为普通数组
[root@node101.yinzhengjie.org.cn ~]# student_info[“name”]=“尹正杰”
[root@node101.yinzhengjie.org.cn ~]# student_info[“age”]=18
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${student_info[“name”]}      #我们发现查询结果和咱们预期的不符哟!
18
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${student_info[“age”]}
18
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# unset student_info           #将上面的普通数组删除掉,然后使用关联数组来保存数据。
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# declare -A student_info        #声明为关联数组
[root@node101.yinzhengjie.org.cn ~]# student_info[“name”]=“尹正杰”
[root@node101.yinzhengjie.org.cn ~]# student_info[“age”]=18
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${student_info[“name”]}     #发现关联数组的确可以保存咱们的变量呢
尹正杰
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${student_info[“age”]}
18
[root@node101.yinzhengjie.org.cn ~]#
复制代码

五.小试牛刀

1>.生成10个随机数保存于数组中,并找出其最大值和最小值

参考案例1
参考案例2
2>.编写脚本,定义一个数组,数组中的元素对应的值是/var/log目录下所有以.log结尾的文件;统计出其下标为奇数的文件中的行数之和

参考案例
3>.输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序

4>.打印杨辉三角形

5>.将下图所示,实现转置矩阵matrix.sh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值