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

                                   作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.数组相关概述

变量:
  存储单个元素的内存空间 数组:
  存储多个元素的连续的内存空间,相当于多个变量的集合 数组名和索引
  索引:编号从0开始,属于数值索引
  注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持(关联数据使用时必须提前声明类型)
  bash的数组支持稀疏格式(索引不连续) 声明数组:
  declare -a ARRAY_NAME
  declare -A ARRAY_NAME: 关联数组
  注意:普通数组不用事先声明就可以使用,但关联数组必须提前声明才能使用,且两者不可相互转换。
[root@node101.yinzhengjie.org.cn ~]# bash --version
GNU bash, version 4.2.()-release (x86_64-redhat-linux-gnu)
Copyright (C) Free Software Foundation, Inc.
License GPLv3+: GNU GPL version or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@node101.yinzhengjie.org.cn ~]#

[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[]=CEO   #逐一对数组进行赋值
[root@node101.yinzhengjie.org.cn ~]# title[]=COO
[root@node101.yinzhengjie.org.cn ~]# title[]=CTO
[root@node101.yinzhengjie.org.cn ~]# title[]=CFO
[root@node101.yinzhengjie.org.cn ~]# title[]=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[]}      #查看指定的元素下标
COO
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[]}
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 ${title[*]}
CEO COO CTO CFO devops
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# title[${#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的元素
[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[@]} [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 ~]# 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[@]} [root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# unset title
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]} [root@node101.yinzhengjie.org.cn ~]#

3>.只赋值特定元素(稀疏格式)

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

[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# title=([]=CEO []=CTO []=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[*]}
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[*]} [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 ~]#
[root@node101.yinzhengjie.org.cn ~]#

5>.显示所有数组

[root@node101.yinzhengjie.org.cn ~]# student[]="jason"
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# student[]="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:
#Date: --
#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[]=CEO
title[]=COO
title[]=CTO
title[]=CFO
title[]=devops count=`seq $[${#title[*]}-]` for i in $count
do
echo Title is ${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[*]::}             #跳过第一个元素并取出后续2个元素
COO CTO
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo ${title[*]:}               #跳过前2个元素,后面的元素全都要
CTO CFO devops
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]#

2>.向数组中追加元素

[root@node101.yinzhengjie.org.cn ~]# echo ${title[*]}
CEO COO CTO CFO devops
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# title[${#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"]=
[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"]} [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"]=
[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"]} [root@node101.yinzhengjie.org.cn ~]#

五.小试牛刀

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

[root@node101.yinzhengjie.org.cn ~]# cat shell/max_min.sh
#!/bin/bash
#
#********************************************************************
#Author: yinzhengjie
#QQ:
#Date: --
#FileName: shell/max_min.sh
#URL: http://www.cnblogs.com/yinzhengjie
#Description: The test script
#Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated.
#******************************************************************** declare -i min max
declare -a nums for ((i=;i<;i++));do
nums[$i]=$RANDOM
[ $i -eq ] && min=${nums[$i]} && max=${nums[$i]}&& continue
[ ${nums[$i]} -gt $max ] && max=${nums[$i]}
[ ${nums[$i]} -lt $min ] && min=${nums[$i]}
done echo "All numbers are ${nums[*]}"
echo "Max is $max"
echo "Min is $min"
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh
All numbers are
Max is
Min is
[root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh
All numbers are
Max is
Min is
[root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh
All numbers are
Max is
Min is
[root@node101.yinzhengjie.org.cn ~]#

参考案例1

[root@node101.yinzhengjie.org.cn ~]# cat shell/max_min.sh
#!/bin/bash
#
#********************************************************************
#Author: yinzhengjie
#QQ:
#Date: --
#FileName: shell/max_min.sh
#URL: http://www.cnblogs.com/yinzhengjie
#Description: The test script
#Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated.
#******************************************************************** declare -i min max
declare -a nums for ((i=;i<;i++));do
nums[$i]=$RANDOM
if [ $i -eq ];then
max=${nums[$i]}
min=${nums[$i]}
else
if [ "$max" -lt "${nums[$i]}" ];then
max=${nums[$i]}
elif [ "$min" -gt "${nums[$i]}" ];then
min=${nums[$i]}
else
true
fi
fi
done echo "All numbers are ${nums[*]}"
echo "Max is $max"
echo "Min is $min"
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh
All numbers are
Max is
Min is
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh
All numbers are
Max is
Min is
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh
All numbers are
Max is
Min is
[root@node101.yinzhengjie.org.cn ~]#

参考案例2

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

[root@node101.yinzhengjie.org.cn ~]# cat shell/log_wc.sh
#!/bin/bash
#
#********************************************************************
#Author: yinzhengjie
#QQ:
#Date: --
#FileName: shell/log_wc.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 files
files=(/var/log/*.log)
declare -i lines=0 for i in $(seq 0 $[${#files[*]}-1]); do
if [ $[$i%2] -eq 1 ];then
let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1)
fi
done echo "Lines: $lines."
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll /var/log/*.log
-rw-------. 2 root root 0 Nov 28 07:41 /var/log/boot.log
-rw-------. 1 root root 15539 Nov 23 07:04 /var/log/yum.log
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# wc -l /var/log/boot.log
0 /var/log/boot.log
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# wc -l /var/log/yum.log
256 /var/log/yum.log
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# bash shell/log_wc.sh
Lines: 256.
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]#

参考案例

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

4>.打印杨辉三角形

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

SHELL脚本编程-普通数组(列表)和关联数组(字典)的更多相关文章

  1. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...

  2. Linux Shell脚本编程-数组和字符串处理

    数组  1.数组的定义及声明 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合 数组名:整个数组只有一个名字 索引:编号从0开始,属于数值索引:bash的数组支持 ...

  3. SHELL脚本编程的常识和VI常用技巧

    来源:http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc3751808 ...

  4. 浅谈自底向上的Shell脚本编程及效率优化

    作者:沐星晨 出处:http://blog.csdn.net/sosodream/article/details/6276758 浅谈自底向上的Shell脚本编程及效率优化 小论文,大家多批评指导:) ...

  5. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  6. Shell脚本编程具体解释

    第12章 Shell脚本编程   l  Shell命令行的执行 l  编写.改动权限和运行Shell程序的步骤 l  在Shell程序中使用參数和变量 l  表达式比較.循环结构语句和条件结构语句 l ...

  7. 30分钟快速学习Shell脚本编程

    什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch ...

  8. 《Linux命令行与shell脚本编程大全》第二十二章 gawk进阶

    gawk是一门功能丰富的编程语言,你可以通过它所提供的各种特性来编写好几程序处理数据. 22.1 使用变量 gawk编程语言支持两种不同类型的变量: 内建变量和自定义变量 22.1.1 内建变量 ga ...

  9. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she1.1   什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...

随机推荐

  1. weixin-js-sdk

    场景:在h5移动端,实现分享朋友,分享朋友圈. 插曲:一开始我认为是不能做到分享的,主要是我从微信小程序的角度出发的,想着微信小程序都做不到分享朋友圈功能,那h5就更不能实现了,导致出现了错误的判断. ...

  2. FastJson序列化时过滤字段(属性)的方法总结

    FastJson序列化时(即转成JSON字符串时),可以过滤掉部分字段,或者只保留部分字段,方法有很多,下面举一些常用的方法. 方法一.FastJson的注解 @JSONField(serialize ...

  3. 【NPDP笔记】第六章 市场研究

      6.1 产品市场研究 客户心声Voice of Customer,为了找出问题的解决方法,引导消费者经历一系列的情景并进行结构化的深度访谈,以提炼客户需求的过程 在产品开发决策中,需要获取的信息 ...

  4. docker添加mongo4.0.3并配置复制集

    1.创建docker 具体略过 自行百度 2.创建数据持久化目录文件(/data/mongo0是个例子 命名随意)  拉取mongo docker pull mongo:4.0.3 3.启动容器 do ...

  5. (CSDN 迁移) JAVA多线程实现-可回收缓存线程池(newCachedThreadPool)

    在前两篇博客中介绍了单线程化线程池(newSingleThreadExecutor).可控最大并发数线程池(newFixedThreadPool).下面介绍的是第三种newCachedThreadPo ...

  6. JSON学习(二)

    首先,定义一个实体类Person: import com.fasterxml.jackson.annotation.JsonFormat; import java.util.Date; public ...

  7. 深度学习-生成对抗网络GAN笔记

    生成对抗网络(GAN)由2个重要的部分构成: 生成器G(Generator):通过机器生成数据(大部分情况下是图像),目的是“骗过”判别器 判别器D(Discriminator):判断这张图像是真实的 ...

  8. RT1052 BootLoader总结

    RT1052 BootLoader总结‍ 概述 Bootloader涉及到的RT1052单片机资源有:Cache,ram,外部SDRAM,ARM7汇编指令,外部dataFlash. 升级功能涉及到的其 ...

  9. TCP/IP详解 IP路由选择

    TCP/IP详解 IP路由选择 在本篇文章当中, 将通过例子来说明IP路由选择器过程 如图所示, 主机A与主机B分别是处在两个不同的子网当中, 中间通过一个路由连接. 如果主机A请求与主机B进行通行, ...

  10. scratch少儿编程第一季——09、声音模块:吹拉弹唱我也会

    各位小伙伴大家好: 上期我们学习了外观模块的指令,学会了制作特效. 本期我们来学习如何给游戏配音. 声音模块的指令不是很多,我们一起来看看吧. 首先第一个就是播放声音,里面默认插入了喵叫声. 我们点击 ...