Linux基础之bash脚本进阶篇-数组

简介:

数组

什么是数组?

计算机中的数组指的是具有相同类型若干变量按照一定的顺序组织起来的一种数据类型

通俗点来说数组就是变量的一种,按现在的术语来说就是变量圈子中的一个,只不过这个变量圈子都是相同类型的变量并有一定的组织顺序。


数组的格式

array[key]=value

array:表示数组变量的名称

key:表示数组元素的索引又称下标

value:表示key对应的数组元素的值


大体了解了什么是数组,下面就来了解下如何定义数组或如何创建数组



定义数组

定义数组主要有如下几种类型

1、通过指定元素来定义数组

1
2
3
4
5
6
7
#!/bin/bash
#通过指定元素来定义数组
#指定数组元素值
array[0]=8
array[2]=two
#输出数组元素
echo  "${array[@]}"

运行脚本

1
2
[root@docker  test ] # sh 20160910-1
8 two

2、通过declare语句来定义数组

1
2
3
4
5
6
7
8
9
#!/bin/bash
#通过declare语句来定义数组
#定义数组 -a 选项表示后面定义的是一个名为array的数组。
declare  -a array
#为元素赋值
array[0]=1
array[1]=2
#输出元素值
echo  "${array[@]}"

运行脚本

1
2
[root@docker  test ] # sh 20160910-2
1 2

通过上面两个例子,其实可以发现在shell中这样的声明不是非常必要的,因为在shell中,所有的变量不必显示定义就可以用作数组,在某种意义上所有变量都是数组赋值给没有下标的变量与赋值给下标内为0的元素效果是相同的

示例:

1
2
3
4
#!/bin/bash
tom=1
echo  "${tom}"
echo  "${tom[0]}"

运行脚本

1
2
3
[root@docker  test ] # sh 20160910-3
1
1

由结果可知赋值给没有下标的变量与赋值给下标内为0的元素效果是相同的。


3、通过元素列表定义数组

1
2
3
4
5
6
7
8
#!/bin/bash
#通过元素列表定义数组
#定义数组
array=(1 2 3 4 5 6)
#输出第4个数组元素的值
echo  "The fourth element is ${array[3]}"
#输出所有元素的值
echo  "The elements of this array are ${array[@]}"

运行脚本

1
2
3
[root@docker  test ] # sh 20160910-4
The fourth element is 4
The elements of this array are 1 2 3 4 5 6



数组的访问或查看

数组访问有若干途径,下面列举常用两种

1、通过索引值来查看其对应的元素值

1
2
3
4
5
#!/bin/bash
#定义数组
array=(1 2 3)
#查看下标为1的元素
echo  "the second element is ${array[1]}"

运行脚本

1
2
[root@docker  test ] # sh 20160910-5
the second element is 2


2、通过循环列表遍历数组

我们如果要用for循环的c表达,那么有一个问题需要解决,就是取值范围,而数组中有多少个元素只有定义的人才知道,如果有一个现成的数组,我们在不知道其有多少个元素的情况下如何通过for循环遍历显示?

为此我们需要先知道该数组有多少个元素,在数组里面可以通过${#array[@]}表示

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#通过循环列表定义数组
#定义数组
array=(one two three four five 6 7 8 9 10)
#获取数组长度
length= "${#array[@]}"
#通过循环遍历数组
for  ((i=0;i<$length;i++)); do
     echo  "${array[$i]}"
done

运行脚本

1
[root@docker  test ] # sh 20160910-6
1
2
3
4
5
6
7
8
9
10
one
two
three
four
five
6
7
8
9
10



关联数组

“关联数组”是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它

关联数组必须事先声明,否则导致创建关联数组失败

declare -A  array声明关联数组

array=([a]=tom [b]=john [c]=3)

如果我们定义下标内是人名其对应的元素为成绩,那么输入指定的人名就可以知道其对应的成绩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
#定义关联数组
declare  -A grades
#为数组下标指定对应的分数
grades=([tom]=90 [lilei]=88 [rose]=92 [Lucy]=80)
#给一个名字
read  -p  "Give a name : "  name_G
#判断是否给了内容,若没有则在提示后退出
[ -z $name_G ] &&  echo  "None please select [tom|lilei|rose|Lucy] && exit 1"
#根据输入的名字输出对应的分数
case  $name_G  in
tom)
   echo  "tom's grades is ${grades[tom]}" ;;
lilei)
   echo  "lilei's grades is ${grades[lilei]}" ;;
rose)
   echo  "rose's grades is ${grades[rose]}" ;;
Lucy)
   echo  "Lucy's grades is ${grades[Lucy]}" ;;
*)
   echo  "please select [tom|lilei|rose|Lucy]"
esac

运行脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@docker  test ] # sh 20160910-7
Give a name : tom
Tom's grades is 90
[root@docker  test ] # vim 20160910-7
[root@docker  test ] # sh 20160910-7
Give a name : rose
rose's grades is 92
[root@docker  test ] # sh 20160910-7
Give a name : lilei
lilei's grades is 88
[root@docker  test ] # sh 20160910-7
Give a name : Lucy
Lucy's grades is 80
[root@docker  test ] # sh 20160910-7
Give a name : other
please  select  [tom|lilei|rose|Lucy]



数组的增删合


增加数组个数

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
#定义数组
array=(1 2)
#显示数组所有元素
echo  "${array[@]}"
#显示数组元素个数
echo  "${#array[@]}"
#追加数组元素
array[2]=3
array[3]=4
#显示追加后的数组信息
echo  "${array[@]}"
echo  "${#array[@]}"

运行脚本

1
2
3
4
5
[root@docker  test ] # sh 20160910-8
1 2
2
1 2 3 4
4

可以从数组的任意未使用的下标数开始。可以非连续增加数组


删除数组

1、删除数组指定某个元素

命令:unset array[n]

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
#定义数组
array=(1 2 3)
#显示数组所有元素
echo  "${array[@]}"
#显示下标为0的数组元素
echo  "${array[0]}"
#删除下标为0的数组元素
unset  array[0]
echo  "${array[@]}"
echo  "${array[0]}"


2、删除整个数组

命令:unset array

1
2
3
4
5
6
7
#!/bin/bash
#定义数组
array=(1 2 3)
echo  "${array[@]}"
#删除整个数组
unset  array
echo  "${array[@]}"

运行脚本

1
2
[root@docker  test ] # sh 20160910-9
1 2 3


数组之间的合并

数组可以将多个不同的数组组合成一个新的数组。

数组连接语法如下:

("${array1[@]}" "${array2[@]}" ... "${arrayN[@]}")

数组之间用空格隔开

示例

1
2
3
4
5
6
7
#定义两个数组
array1=(1 2 3)
array2=(4 5 6)
#连接数组
array1_2=( "${array1[@]}"  "${array2[@]}" )
#显示合并后数组的所有元素
echo  "${array1_2[@]}"

运行脚本

1
2
[root@docker  test ] # sh 20160910-10
1 2 3 4 5 6



数组中的切片

所谓切片,是指截取数组的部分元素或某个元素的部分内容

基本语法为:${array[@|*|n]:start:length}

示例1:给定一个长度为8的数组,截取第3个元素开始的4个元素。

1
2
3
4
#!/bin/bash
array=(1 2 3 4 5 6 7 8)
var=${array[@]:3:4}
echo  "$var"

运行脚本

1
2
[root@docker  test ] # sh 20160910-11
4 5 6 7


示例2:给定一个长度为3的数组,截取第2个元素,从该元素的第1个字符开始,截取其中3个字符

1
2
3
4
#!/bin/bash
array=(apple orange banana)
var=${array[2]:1:3}
echo  "$var"

运行脚本

1
2
[root@docker  test ] # sh 20160910-12
ana

数组中的替换

数组的替换是指将某个数组元素的部分内容用其他字符串来代替,但不影响原来的数组的值。

基本语法为:${array[@|*]/pattern/replacement}

1
2
3
4
#!/bin/bash
replace=(a b c d e)
echo  "the replaced array is ${replaced[@]/c/3}"
echo  "the original array is ${replace[@]}"

运行脚本

1
2
3
[root@docker  test ] # sh 20160910-13
the replaced array is a b 3 d e
the original array is a b c d e



小结

本文主要讲述数组的概念数组的定义数组的查看关联数组的使用数组的增删合数组的切片数组的替换这7部分内容。

感触:我在总结完数组后,隐隐感觉到数组与数据库之间有一定的关联性。

查看历史可以知道数组诞生于数据库之前,因此我感觉数据库这个思想一定程度上是借鉴了数组的一些理念。当然数据库比数组要强大很多,在数据查询搜索专业许多。可还是觉得这两者之间有种本质上的一致:基于数据之间的对应。










本文转自 紫色的茶碗 51CTO博客,原文链接:http://blog.51cto.com/chawan/1851443,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
Java Linux
自定义linux脚本用于快速jar包启动、停止、重启
自定义linux脚本用于快速jar包启动、停止、重启
240 29
|
4月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
113 4
|
4月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
252 3
|
5月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
382 25
|
5月前
|
安全 Linux
阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip
公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
420 28
|
7月前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
564 32
|
7月前
|
存储 Linux 网络安全
linux应急响应检查脚本
通过这个脚本,可以快速收集系统的关键信息,有助于在发生问题时进行及时的应急响应和分析。
236 34
|
9月前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
2083 1
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
10月前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
147 1
|
10月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。