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

简介:

数组


什么是数组?


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


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



数组的格式


array[key]=value


array:表示数组变量的名称


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


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



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



—————————————————————————————————————————————

定义数组


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


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

#!/bin/bash

#通过指定元素来定义数组

#指定数组元素值

array[0]=8

array[2]=two

#输出数组元素

echo "${array[@]}"


运行脚本


[root@docker test]# sh 20160910-1

8 two


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

#!/bin/bash

#通过declare语句来定义数组

#定义数组 -a 选项表示后面定义的是一个名为array的数组。

declare -a array

#为元素赋值

array[0]=1

array[1]=2

#输出元素值

echo "${array[@]}"


运行脚本

[root@docker test]# sh 20160910-2

1 2


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


示例:

#!/bin/bash

tom=1

echo "${tom}"

echo "${tom[0]}"


运行脚本

[root@docker test]# sh 20160910-3


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



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


#!/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[@]}"


运行脚本

[root@docker test]# sh 20160910-4

The fourth element is 4

The elements of this array are 1 2 3 4 5 6



—————————————————————————————————————————————

数组的访问或查看


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


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

#!/bin/bash

#定义数组

array=(1 2 3)

#查看下标为1的元素

echo "the second element is ${array[1]}"


运行脚本

[root@docker test]# sh 20160910-5

the second element is 2



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


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


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


#!/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


运行脚本

[root@docker test]# sh 20160910-6

one

two

three

four

five

6

7

8

9

10


—————————————————————————————————————————————

关联数组


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


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


declare -A  array声明关联数组


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


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


#!/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


运行脚本

[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]


—————————————————————————————————————————————

数组的增删合



增加数组个数


#!/bin/bash

#定义数组

array=(1 2)

#显示数组所有元素

echo "${array[@]}"

#显示数组元素个数

echo "${#array[@]}"

#追加数组元素

array[2]=3

array[3]=4

#显示追加后的数组信息

echo "${array[@]}"

echo "${#array[@]}"


运行脚本


[root@docker test]# sh 20160910-8

1 2

2

1 2 3 4

4


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



删除数组


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


命令:unset array[n]

#!/bin/bash

#定义数组

array=(1 2 3)

#显示数组所有元素

echo "${array[@]}"

#显示下标为0的数组元素

echo "${array[0]}"

#删除下标为0的数组元素

unset array[0]

echo "${array[@]}"

echo "${array[0]}"



2、删除整个数组


命令:unset array


#!/bin/bash

#定义数组

array=(1 2 3)

echo "${array[@]}"

#删除整个数组

unset array

echo "${array[@]}"


运行脚本

[root@docker test]# sh 20160910-9

1 2 3



数组之间的合并


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


数组连接语法如下:


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


数组之间用空格隔开


示例

#定义两个数组

array1=(1 2 3)

array2=(4 5 6)

#连接数组

array1_2=("${array1[@]}" "${array2[@]}")

#显示合并后数组的所有元素

echo "${array1_2[@]}"


运行脚本

[root@docker test]# sh 20160910-10

1 2 3 4 5 6


—————————————————————————————————————————————

数组中的切片


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


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


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

#!/bin/bash

array=(1 2 3 4 5 6 7 8)

var=${array[@]:3:4}

echo "$var"


运行脚本


[root@docker test]# sh 20160910-11

4 5 6 7



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

#!/bin/bash

array=(apple orange banana)

var=${array[2]:1:3}

echo "$var"


运行脚本

[root@docker test]# sh 20160910-12

ana


—————————————————————————————————————————————

数组中的替换


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


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

#!/bin/bash

replace=(a b c d e)

echo "the replaced array is ${replaced[@]/c/3}"

echo "the original array is ${replace[@]}"


运行脚本

[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部分内容。


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


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



本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/1852296,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
408 9
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
279 0
Linux系统初始化脚本
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
291 2
|
4月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
519 1
|
6月前
|
Java Linux
自定义linux脚本用于快速jar包启动、停止、重启
自定义linux脚本用于快速jar包启动、停止、重启
322 29
|
6月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
194 4
|
6月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
394 3
|
7月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
609 25
|
7月前
|
安全 Linux
阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip
公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
593 28
|
9月前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
707 32

热门文章

最新文章