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 : 索引数组的更多相关文章

  1. bash之数组

    Bash 提供索引和联想的一维数组变量.可用作任何变量 索引的数组 :内置的声明将显式声明数组.有没有最大限制 一个数组,也没有要求成员将索引或连续分配的大小.索引的数组 引用使用 (包括算术表达式) ...

  2. bash shell数组使用总结

    本文为原创博文,转发请注明原创链接:https://www.cnblogs.com/dingbj/p/10090583.html  数组的概念就不多说了,大家都懂! shell数组分为索引数组和关联数 ...

  3. JS 索引数组、关联数组和静态数组、动态数组

    JS 索引数组.关联数组和静态数组.动态数组 数组分类: 1.从数组的下标分为索引数组.关联数组 var ary1 = [1,3,5,8]; //按索引去取数组元素,从0开始(当然某些语言实现从1开始 ...

  4. CCLuaObjcBridge调Objective-C方法传索引数组报invalid key to 'next'错调试

    CCLuaObjcBridge是cocos2d-x系列引擎与Objective-C进行交互的"桥梁",老廖的quick-cocos2d-x在其framework进行了简单了封装,封 ...

  5. numpy 数组索引数组

    在numpy中,数组除了可以被整数索引,还可以被数组索引. a[b]就是已数组b的元素为索引,读取数组a的值. 当被索引数组a是一维数组,b是一维或则多维数组时,结果维度维度与索引数组b相同. a = ...

  6. js 索引数组转JSON为空

    let a = [] a.a = 1 console.log(a) // [a: 1] console.log(JSON.stringify(a)) // [] 当然js根本没索引数组一说,这是php ...

  7. PHP索引数组+unset使用不当导致的问题

    转自先知社区 https://xz.aliyun.com/t/2443 0x00前言 通常网站后台可以配置允许上传附件的文件类型,一般登录后台,添加php类型即可上传php文件getshell.但是, ...

  8. JSON_FORCE_OBJECT 数字索引数组 强转对象

    $abc = array('a','b','c','d','e','f','g'); echo '<pre>'; var_dump($abc); echo json_encode($abc ...

  9. 【tp5】索引数组转成关联数组 ( $a=[],转换成 $a['aa'=>2,'bb'=>'3c'] )

    概念: 索引数组 ==== >>>$arr = []; 关联数组 ====>>> $arr = [ 'orange'=>1,'apple'=>'good ...

随机推荐

  1. Fast data loading from files to R

    Recently we were building a Shiny App in which we had to load data from a very large dataframe. It w ...

  2. javascript基础-对象

    原理 万物皆为对象.假设将'莫德'(我)看成对象.莫德的属性有名字,性别,年龄等. 莫德的行为有吃饭,走路,睡觉等.莫德与他人的往来即对象间的交互.对象对应世界的一个实体.类,即管理对象的分类.如果莫 ...

  3. 关于css中的position定位

    希望这波position可以有帮助^_^! css中的position属性主要分为:static.relative.absolute.fixed.center.page.sticky(红色是css3中 ...

  4. 如何通过JS实现简单抖动效果

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. python unittest 测试笔记(二):使用Requests

    1. Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用.[Python Requests快速入门 :]http://cn.python-requests.org/z ...

  6. Python爬虫Dota排行榜爬取

    1.分析网站 打开开发者工具,我们观察到排行榜的数据并没有在doc里 doc文档 在Javascript里我么可以看到下面代码: ajax的post方法异步请求数据 在 XHR一栏里,我们找到所请求的 ...

  7. PHP漏洞之session会话劫持

    本文主要介绍针对PHP网站Session劫持.session劫持是一种比较复杂的攻击方法.大部分互联网上的电脑多存在被攻击的危险.这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能. ...

  8. Navicat11全系列激活(注册机)

    Navicat是一款数据库管理工具, 用于简化, 开发和管理MySQL, SQL Server, SQLite, Oracle 和 PostgreSQL 的数据库: Navicat数据模型工具以图形化 ...

  9. Java基础知识整理(一)

    Java开发环境JDK(Java编辑器.Java运行工具(JRE作用).Java文档生成工具.Java打包工具) 1.Java是严格区分大小写的.2.Java程序中一句连续的字符串不能分开在两行书写, ...

  10. 学容器必须懂 bridge 网络 - 每天5分钟玩转 Docker 容器技术(32)

    上一节我们讨论了 none 和 host 类型的容器网络,本节学习应用最广泛也是默认的 bridge 网络. Docker 安装时会创建一个 命名为 docker0 的 linux bridge.如果 ...