Bash脚本编程之数组
2019-12-04 08:42:36来源:博客园 阅读 ()
Bash脚本编程之数组
数组简介
在bash脚本编程当中,变量是存储单个元素的内存空间;而数组是存储多个元素的一段连续的内存空间。
数组由数组名和下标构成,如下。
ARRAY_NAME[SUBSCRIPT]
数组按照下标的类型可分为两种:
- 索引(indexed)数组:下标为0、1、2等非负整数。
- 关联(associative)数组:下标为用户自定义的字符串。
数组的操作
声明
索引数组可以不声明直接使用;而关联数组如果不声明直接使用的话,会被认为是索引数组,即使它的下标是字符串。
索引数组的声明方式。
# declare -a ARRAY_NAME
关联数组的声明方式。
# declare -A ARRAY_NAME
赋值
一次只赋值一个元素。
# ARRAY_NAME[SUBSCRIPT]=VALUE
一次赋值全部元素。
# ARRAY_NAME = ("VAL1" "VAL2" "VAL3" ...)
一次赋值多个可以是不连续的元素。
# ARRAY_NAME = ([0] = "VAL1" [3] = "VAL3")
像这种不要求元素必须依次存在的数组(即可以在没有A[1]和A[2]的时候就赋值A[3]),叫做稀疏格式数组。因此,bash支持稀疏格式的数组。
读取标准输入赋值数组。
# read -a ARRAY_NAME
在输入的时候,以空格作为元素的分隔符,以回车键结束元素的赋值。
向数组的末尾追加元素。
ARRAY_NAME[${#ARRAY_NAME[@]}]=VALUE
或者
ARRAY_NAME+=(VALUE)
引用
引用单个数组元素。
${ARRAY_NAME[SUBSCRIPT]}
如果省略SUBSCRIPT,那么就等同于SUBSCRIPT=0。即以下两个引用是相同的。
${ARRAY_NAME[0]} ${ARRAY_NAME}
引用数组的所有元素。正常情况下,二者没有区别,只有当被双引号包裹的时候,“@”被展开为每个元素为一个独立的单词;“*”被展开为所有元素为一个统一的单词。
${ARRAY_NAME[@]}
${ARRAY_NAME[*]}
引用数组元素的长度。
${#ARRAY_NAME[SUBSCRIPT]}
引用数组的长度,即数组的元素个数。
${#ARRAY_NAME[@]}
${#ARRAY_NAME[*]}
引用数组的部分元素(切片)。
${ARRAY_NAME[@]:OFFSET:NUMBER}
${ARRAY_NAME[*]:OFFSET:NUMBER}
OFFSET:偏移,表示偏移/跳过数组中的前几个元素。
NUMBER:表示偏移后取几个元素。
如果省略了NUMBER,并且OFFSET的值为“ -n”(注意,-n的左边有空格),则表示引用倒数的几个元素。
截止目前我们引用的都是数组的值,如果我们想引用数组的下标的话,可以使用:
${!ARRAY_NAME[@]}
${!ARRAY_NAME[*]}
删除
删除数组元素。
# unset ARRAY_NAME[SUBSCRIPT]
删除数组。
# unset ARRAY_NAME
数组示例
定义一个索引数组,逐一赋值数组元素。
[root@c7-server ~]# declare -a my_array [root@c7-server ~]# my_array[0]=zhang [root@c7-server ~]# my_array[1]=wen [root@c7-server ~]# my_array[2]=long
根据数组下标获取数组元素。留意我们上文说的,当引用数组不带下标的时候,等同于引用${ARRAY_NAME[0]}。
[root@c7-server ~]# echo ${my_array} zhang [root@c7-server ~]# echo ${my_array[0]} zhang [root@c7-server ~]# echo ${my_array[1]} wen [root@c7-server ~]# echo ${my_array[2]}
引用数组中的所有元素,顺便测试一下“@”和“*”的区别。注意,这个区别,仅在${my_array[@]}或者${my_array[*]}被双引号包裹的情况下才会出现。
[root@c7-server ~]# echo ${my_array[@]} zhang wen long [root@c7-server ~]# echo ${my_array[*]} zhang wen long [root@c7-server ~]# for i in "${my_array[@]}"; do echo $i; done zhang wen long [root@c7-server ~]# for i in "${my_array[*]}"; do echo $i; done zhang wen long
引用数组个数。
[root@c7-server ~]# echo ${#my_array[@]} 3 [root@c7-server ~]# echo ${#my_array[*]} 3
引用数组中元素的个数。
[root@c7-server ~]# echo ${my_array[0]} zhang [root@c7-server ~]# echo ${#my_array[0]} 5
接下来演示其他几种不同的赋值方式,操作前可先删除数组。
[root@c7-server ~]# unset my_array [root@c7-server ~]# my_array=([0]=zhang [1]=wen [2]=long) [root@c7-server ~]# echo ${my_array[@]} zhang wen long [root@c7-server ~]# unset my_array [root@c7-server ~]# read -a my_array Mon Tue Wed Thu Fri Sat Sun [root@c7-server ~]# echo ${my_array[@]} Mon Tue Wed Thu Fri Sat Sun
数组元素去子串(substring),即切片。
[root@c7-server ~]# echo ${my_array[@]} Mon Tue Wed Thu Fri Sat Sun [root@c7-server ~]# echo ${my_array[@]:3:2} Thu Fri [root@c7-server ~]# echo ${my_array[@]:2:3} Wed Thu Fri [root@c7-server ~]# echo ${my_array[@]: -3} Fri Sat Sun
数组元素追加。
[root@c7-server ~]# echo ${my_array[@]} Mon Tue Wed Thu Fri Sat Sun [root@c7-server ~]# my_array+=(ddd) [root@c7-server ~]# my_array[${#my_array[@]}]=eee [root@c7-server ~]# echo ${my_array[@]} Mon Tue Wed Thu Fri Sat Sun ddd eee
引用数组的下标(subscript)。个人感觉引用数组下标在关联数组中比较有用,在索引数组中用处不大。
[root@c7-server ~]# echo ${!my_array[@]} 0 1 2 3 4 5 6 7 8 [root@c7-server ~]# unset my_array [root@c7-server ~]# declare -A my_array [root@c7-server ~]# my_array=([name]=zwl [age]=28 [sex]=male) [root@c7-server ~]# echo ${my_array[@]} zwl 28 male [root@c7-server ~]# echo ${!my_array[@]} name age sex
练习题
题一:生成10个随机数并输出,然后输出其中的最大值和最小值。
题二:生成10个随机数并输出,然后将其由小到大进行排序。
题三:定义一个数组,数组元素为/var/log/目录下所有以.log结尾的文件的文件名;统计下标为偶数的文件的行数并求和。
原文链接:https://www.cnblogs.com/alongdidi/p/bash_array.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Linux系统如何设置开机自动运行脚本? 2020-06-11
- Linux指令和shell脚本 2020-06-11
- Ubuntu下用脚本执行sql语句(sqlite) 2020-05-29
- 如何将目录下的脚本一次性全部执行 2020-05-28
- Bash Shell基础笔记 2020-05-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash