bash shell数组使用总结
本文为原创博文,转发请注明原创链接:https://www.cnblogs.com/dingbj/p/10090583.html
数组的概念就不多说了,大家都懂!
shell数组分为索引数组和关联数组,今天只说普通的索引数组。
定义数组
像很多脚本语言一样,shell变量不区分类型,对于普通数组,可申明也可以不申明:
如果习惯使用声明,就使用declare 命令声明
例如:declare -a myarray
数组初始化:在赋值语句的等号右侧,紧挨着用一对括号表示数组,数组中元素之间使用“空格”分隔。
例如:
myarray=() #定义一个空数组
myarray=(1 2 3 4 5) #全部元素为数字
myarray=(one two three four five) #全部元素为字符串
myarray=(1 two 3 three 4 five) #元素由数值和字符串构成
myarray=(1 two 3 “a phrase” 5 now)
当然也可以直接为数组元素赋值来定义数组
例如:
myarray[0]=1
myarray[2]=test
myarray[3]="a phrase"
....
引用操作数组
既然数组是一个变量,当然引用时也得使用$符开头,但和普通标量变量不同,引用整个数组,需要使用${arr_name[*]}或${arr_name[@]}形式,否则使用$arr_name或者${arr_name}只会得到第一个元素。同样,和标量变量一样,数组变量也可以进行长度、分片、替换等操作,如下:
用下标读取某个元素的值
arr_element2=${arr_name[2]},即形式:${数组名[下标]}
用#获取数组长度:${#数组名[@]} 或${#数组名[*]}
arr_len=${#arr_name[*]}或${#arr_name[@]}
用#获取某元素值的长度
arr_elem_len=${#arr_name[index]} #index为数组下标索引
删除数组
删除数组某个元素:unset arr_name[index]
删除整个数组:unset arr_number
数组分片访问
分片访问形式为:${数组名[@或*]:开始下标:偏移长度}
例如:
arr_name=(1 2 3 test go now)
echo ${arr_name[@]:1:2},将输出2 3
${arr_name[@]:1:2},这里分片访问从下标1开始,元素个数为2。
有用的数组扩展
数组支持”+=“赋值运算符,利用这一点可以通过这种方式往一个已知数组中更方便的添加元素,特别是往空数组中填充元素时非常有用
例如:
实际应用举例:
为了充分利用多核处理器,对一组文件进行md5散列计算时,将每个文件的md5计算放到后台,
利用空数组把每次调用md5sum命令产生的后台进程ID收集到空数组中,并等待所有后台md5sum进程结束后才退出主进程
下面是gen_checksum.sh脚本的内容:
#!/bin/bash
#文件名:gen_checksum.sh
PIDARRAY=()
for file in file{1..10}iso ; do
md5sum $file &
PIDARRAY+=($!)
done
wait ${PIDARRAY[@]}
另一种方法扩展数组
利用shell只有一维数组,在赋值时引用多个数组进行合并
例如:
格式:merge_array=( ${a[@] ${b[@]} ... )
模式替换
格式为:${数组名[@或*]/模式/新值}
例如:echo ${arr_name[@]/now/past},将输出1 2 3 test go past
数组的遍历
通常我们使用for命令遍历数组,遍历数组时对数组引用通常需要加上双引号,这样才能正确遍历含有空格字符串的元素
例如:定义了数组arr_name=(1 2 3 test go now "a whole sentence"),遍历时 输出如下:
如果使用${arr_name[*]}格式引用数组进行遍历,将得到一个数组元素以空格分隔的字符串
为什么遍历数组时要加双引号?
无论使用@还是*的格式引用数组,不存在含空格的元素时,加不加引号对数组遍历不会有什么问题,
但一旦元素中含有空格,将不能得到预期效果,在实际使用时,元素的值通常时变量替换得到的,这不能保证
是否含有空格,因此,为了稳妥起见,建议用引号括住数组变量,下面时不加引号的表现:
例如:最后一个元素的值是a whole sentence字符串,包含有空格,但遍历后以空格被拆分了,显然这不是我们想要的结果
bash shell数组使用总结的更多相关文章
- [Bash Shell] Shell学习笔记
1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...
- Learning The Bash Shell读书笔记(整理)
最近搞了一本书 Learning Bash Shell,发现有人已经写了阅读笔记,我就在这边整理一下 来自blog:http://blog.sina.com.cn/n4mine Learning Th ...
- Shell数组例子
Shell数组例子 循环打印数组,并统计数组的个数: [root@slavedb array]# cat a.sh #!/bin/bash array=( freddy freddie tang sh ...
- shell脚本学习之Bash shell 里各种括号的用法
今天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括 ...
- bash shell学习-实践 (自己实现一些小工具)
The poor starve while the rich feast. "穷人饥肠辘辘,富人大吃大喝" 参考资料:鸟哥的Linux私房菜 基础学习篇(第三版) Linux S ...
- bash shell学习-shell基础 (笔记)
When you hoist the sails to cross the sea, you willride the wind and cleave the waves. "长风破浪会有时 ...
- 系统管理中 bash shell 脚本常用方法总结
在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则 1. 单引号和双引号的区别 单引 ...
- (转)linux bash shell 入门教程
Shell Script(bash)简介 众所皆知地,UNIX上以小工具著名,利用许多简单的小工具,来完成原本需要大量软体开发的工作,这一点特色,使得UNIX成为许多人心目中理想的系统平台. 在众多的 ...
- 教你使用shell数组
数组的使用,需要掌握 1.对数组进行赋值 2.通过下标访问数组元素 3.循环遍历所有的元素 代码如下: #!/bin/bash a="39" b="5" c=& ...
随机推荐
- 解决python3 ,ModuleNotFoundError: No module named 'pip'问题
今天想要装一下PyYmal第三方库来写一下Python的desired_caps.yaml文件,候发现cmd窗口下无法执行pip命令, 出现了:ModuleNotFoundError: No modu ...
- 算法(Java实现)—— 分治算法
分治算法 分治算法的设计模式 基本思想 把复杂问题分解成若干互相独立容易求解的子问题 经典问题 二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔 ...
- 拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)
在实际的工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用linux内核最经典的双向链表 list_head.本篇文章详细介绍了Linux内核的通用链表是如何实现的,对于经常使 ...
- [日常摸鱼]UVA11424&11426 GCD - Extreme
话说UVa的机子跑的好快呀- (两题题意一样,前一题数据范围比较小) 题意:求$\sum_{i=1}^{n-1} \sum_{j=i+1}^n gcd(i,j),n<4\times 10^6$ ...
- Eureka系列(七) 服务下线Server端具体实现
服务下线的大致流程图 下面这张图很简单地描述了Server端服务下线的大致流程: 服务下线Server端实现源码分析 Eureka服务实现是通过Server端InstanceResource ...
- 制作3D小汽车游戏(上)
之前一段时间家里和公司的事太多,一直没有时间写博客,最近腾出一段时间,看了一遍官方的examples,收货颇多,想整理一点东西出来,又苦于没有好的东西,three写点东西真是太难了.好吧,今天郭先生就 ...
- 篇章三:SVN-对文件的操作
添加文件 在检出的工作副本中添加一个Readme文本文件,这时候这个文本文件会显示为没有版本控制的状态,如图: 这时候,你需要告知TortoiseSVN你的操作,如图: 加入以后,你的文件会变成这个状 ...
- matplotlib学习日记(三)------简单统计图
(一)函数bar()---------绘制柱状图 import matplotlib as mpl import matplotlib.pyplot as plt mpl.rcParams[" ...
- PhPMyadmin拿Shell
phpmyadmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具, --百度百科 1.入口寻找 目录扫描: 根据Linux对大小写敏感判断目标服 ...
- C# 9 新特性 —— 增强的 foreach
C# 9 新特性 -- 增强的 foreach Intro 在 C# 9 中增强了 foreach 的使用,使得一切对象都有 foreach 的可能 我们来看一段代码,这里我们试图遍历一个 int 类 ...