Bash : 索引数组
Bash 提供了两种类型的数组,分别是索引数组(indexed array)和关联数组(associative array)。本文主要介绍索引数组的基本用法。
索引数组的基本特点
Bash 提供的数组都是一维数组。
任何变量都可以用作索引数组。
通过 declare 关键字可以显式的声明一个索引数组。
数组的大小是不受限制的。
索引数组的元素的索引不必是连续的。
通过从零开始的整数引用数组元素。
除非另外注明,索引数组必须使用非负的整数索引元素。
自动创建索引数组
通过赋值语句可以隐式的创建索引数组:
- $ myArr[]=apple
通过给索引为 0 的元素赋值,变量 myArr 会被初始化成一个索引数组。
当然也可以这样:
- $ myArr[]=orange
不用必须从索引 0 开始赋值。
显式声明一个索引数组
通过 declare 关键字和 -a 选项可以显式的声明索引数组:
- $ declare -a myArr
然后进行初始化:
- $ myArr=(apple orange pear)
也可以在声明的时候进行初始化:
- $ declare -a myArr=(apple orange pear)
或者在声明后只初始化某个元素:
- $ myArr[]=grape
引用数组元素
引用数组元素稍微麻烦些,不仅要指定元素的索引位置,还需要使用 ${} 符号。请注意,索引数组的下标从 0 开始,且不能为负数(真希望所有编程语言中的数组元素都从 0 开始索引!)。
- $ myArr[]=apple
- $ echo ${myArr[]}
如果不小心引用了没有赋值的元素呢?不用担心,这里没有程序崩溃的问题,只不过没有输出内容而已:
我们还可以轻松的输出数组的全部元素:
- $ declare -a myArr=(apple orange pear)
- $ myArr[]=grape
- $ echo ${myArr[@]}
第四个元素的索引是不连续的。我们可以获取到所有已经赋值元素的下标进行查看:
- $ echo ${!myArr[@]}
变量也可以用来索引数组元素:
- $ declare -a myArr=(apple orange pear)
- $ i=
- $ echo ${myArr[$i]}
对于索引数组,如果你不按规矩引用数组元素可能产生一些诡异的状况。比如,用一个字符串代替非负的整数去索引元素会发生什么?
- $ declare -a myArr=(apple orange pear)
- $ echo ${myArr[hello]}
这往往不是你想要的结果。实际上,无论你写什么样的字符串,都会被当做 0 来处理。
添加数组元素
比较常见的数组操作是在数组的尾部添加新的元素(严谨点说,这应该是队列的一个特征!):
- $ declare -a myArr=(apple orange pear)
- $ myArr=("${myArr[@]}" grape)
- $ echo ${myArr[@]}
请注意最后一行的输出,这样添加的元素的索引是连续的。
把两个数组连接成一个也是比较常见的操作:
- $ declare -a myAbc=(a b c)
- $ myArr=("${myArr[@]}" "${myAbc[@]}")
- $ echo ${myArr[@]}
提取子数组
提取部分数组元素:
- $ declare -a myArr=(a b c d e f g)
- $ echo ${myArr[@]::}
数组的长度
在 Bash 中,引用数组长度的语法多少有些奇特:
- $ declare -a myArr=(apple orange pear)
- $ echo ${#myArr[@]}
数组长度是指被赋值了的元素个数:
- $ myArr[]=grape
- $ echo ${#myArr[@]}
我们还可以获取到某个元素的长度:
哈哈,看起来有些像二维数组了!
遍历数组元素
通过 for 语句可以像其它编程语言那样遍历数组中的元素:
- $ declare -a myArr=(apple orange pear)
- $ myArr[]=grape
- $ for element in "${myArr[@]}"; do echo $element done
删除数组元素
- $ declare -a myArr=(apple orange pear)
- $ unset myArr[]
- $ echo ${myArr[]}
索引为 1 的元素已经为空了,其实数组的长度也发生了变化:
- $ echo ${#myArr[@]}
此时数组的长度已经变成了 2。
下面来个复杂点的:
- $ declare -a myArr=(a b c d e f)
- $ myArr=("${myArr[@]:0:3}" "${myArr[@]:4}")
上面的代码移除了元素 d:
清空数组
- $ declare -a myArr=(apple orange pear)
- $ unset myArr
- $ echo ${myArr[@]}
OK,数组里已经没有元素了!
Bash : 索引数组的更多相关文章
- bash之数组
Bash 提供索引和联想的一维数组变量.可用作任何变量 索引的数组 :内置的声明将显式声明数组.有没有最大限制 一个数组,也没有要求成员将索引或连续分配的大小.索引的数组 引用使用 (包括算术表达式) ...
- bash shell数组使用总结
本文为原创博文,转发请注明原创链接:https://www.cnblogs.com/dingbj/p/10090583.html 数组的概念就不多说了,大家都懂! shell数组分为索引数组和关联数 ...
- JS 索引数组、关联数组和静态数组、动态数组
JS 索引数组.关联数组和静态数组.动态数组 数组分类: 1.从数组的下标分为索引数组.关联数组 var ary1 = [1,3,5,8]; //按索引去取数组元素,从0开始(当然某些语言实现从1开始 ...
- CCLuaObjcBridge调Objective-C方法传索引数组报invalid key to 'next'错调试
CCLuaObjcBridge是cocos2d-x系列引擎与Objective-C进行交互的"桥梁",老廖的quick-cocos2d-x在其framework进行了简单了封装,封 ...
- numpy 数组索引数组
在numpy中,数组除了可以被整数索引,还可以被数组索引. a[b]就是已数组b的元素为索引,读取数组a的值. 当被索引数组a是一维数组,b是一维或则多维数组时,结果维度维度与索引数组b相同. a = ...
- js 索引数组转JSON为空
let a = [] a.a = 1 console.log(a) // [a: 1] console.log(JSON.stringify(a)) // [] 当然js根本没索引数组一说,这是php ...
- PHP索引数组+unset使用不当导致的问题
转自先知社区 https://xz.aliyun.com/t/2443 0x00前言 通常网站后台可以配置允许上传附件的文件类型,一般登录后台,添加php类型即可上传php文件getshell.但是, ...
- JSON_FORCE_OBJECT 数字索引数组 强转对象
$abc = array('a','b','c','d','e','f','g'); echo '<pre>'; var_dump($abc); echo json_encode($abc ...
- 【tp5】索引数组转成关联数组 ( $a=[],转换成 $a['aa'=>2,'bb'=>'3c'] )
概念: 索引数组 ==== >>>$arr = []; 关联数组 ====>>> $arr = [ 'orange'=>1,'apple'=>'good ...
随机推荐
- 在.Net下使用redis基于StackExchange.Redis
研究了下redis在.net下的使用,因为以前在java上用redis用的是jedis操作,在.net不是很熟悉,在网站上也看了一部分的.net下redis的使用,大部分都是ServiceStack. ...
- ASP.NET Web API 自定义 HttpParameterBinding
背景 问题的起因是这样的.群里面一个哥们儿发现在使用 ASP.NET WebAPI 时,不能在同一个方法签名中使用多次 FromBodyAttribute 这个 Attribute .正好我也在用 W ...
- 一天搞定CSS:BFC布局与普通文档流布局比较--15
BFC:Block Formatting Contexts–块级元素格式化上下文 1.BFC定义 它决定了块级元素如何对它的内容进行布局,以及与其它元素的关系和相互作用 关键词解释: 块级元素:父级( ...
- nodejs 路径
在学习的时候遇到了 一些路劲方面的疑惑 便查询了一些 module.filename:开发期间,该行代码所在的文件.__filename:始终等于 module.filename.__dirname: ...
- java 中变量存储位置的区别
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字 ...
- js中运动框架的封装
//获取非行间样式的封装 function setStyle(obj,name){ // 考虑兼容性问题 if(obj.currentStyle){//不兼容火狐和谷歌 return obj.curr ...
- vue初学实践之路——vue简单日历组件(1)
---恢复内容开始--- 最近做的项目有一个需求,需要有一个日历组件供预定功能使用,之前的代码过于繁琐复杂,所以我采用vue重写了这个组件. npm.vue等等安装. 只是一个简单的日历组件,所以并不 ...
- Cordova各个插件使用介绍系列(二)—$cordovaBarcodeScanner扫描二维码与生成二维码
详情链接地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/cordova-2-cordovabarcodescanner/ 这是 ...
- R语言统计分析技术研究——卡方检验的思想和实现
卡方检验的思想和实现 作者:李雪丽 材料摘自:百度
- Zabbix 3.2.6安装过程
以3.2.6版本的Zabbix为例展开说明 1.准备Lnmp环境. 本次准备的环境: Linux:2.6.32-642.el6.x86_64 Nginx:1.12.0 Mariadb:10.2.6 P ...