bash提供了索引数组和关联数组,并且只支持一维。
什么是索引数组?就是用数字作为索引值,操作数组的元素的数组。这就相当于Java的Map<Integer, String>
。
什么是关联数组?就是用字符串作为索引值,操作数组元素的数组。这就相当于Java的Map<String, String>
。
创建数组
创建索引数组
索引数组的创建可以直接通过声明的方式
# 声明一个数组array
declare -a array
或者可以使用一种更有懒惰的方式,不用声明,直接给数组元素赋值,可以自动创建数组
# 不用声明,给数组元素赋值,自动创建数组
array[0]=hello
习惯了高级语言的编程习惯的人来说,对于这种不声明就直接使用数组的语法,是有些抵触的。不过,我也习惯了 bash shell 的奇奇怪怪的语法。
创建关联数组
关联数组的创建方式就严格了,它必须通过如下方式声明来创建,而不能通过访问的方式来自动创建数组
# 必须通过声明的方式创建数组
declare -A array
# 为关联数组元素赋值
array["hello"]=world
索引数组的赋值
数组的赋值与高级语言一致,都是通过数组下标找到数组元素进行赋值,例如
names[0]=david
但是初始化赋值,与高级语言不同,它是使用小括号,而高级语言,例如Java,使用大括号
names=(david frank)
并且还可以指定为某些数组元素赋值
names=([0]=david [2]=frank)
访问索引数组元素
访问数组元素的方式如下
${array[下标]}
理解起来很简单,array[下标]
表示数组元素的名称,然后使用美元符号进行参数展开,获取元素的值。
获取数组的所有元素
我们可能通过@
, *
获取所有元素的值,数组也一样,方式为${a[@]}
, ${a[*]}
。而这两种方式的差别也与获取参数的一样。
$ for i in "${a[*]}"; do echo $i; done
f d c b a
$
$ for i in "${a[@]}"; do echo $i; done
f
d
c
b
a
数组大小
通过参数扩展,我们可以获取字符串的长度,例如 ${#string}
。数组使用 ${#array[@]}
或 ${#array[*]}
获取数组大小。
获取索引值
有时候,我们可能想查看哪些数组元素被赋值,因此需要获取它的索引值。把获取数组大小的语法中的#
替换为!
即可。也就是 ${!array[@]}
或 ${!array[*]}
。
数组名的特殊意义
数组名表示数组第一个元素的名字,颇有点C语言的味道。例如下面直接修改数组第一个元素的值
array=(a b c e f)
# 修改第一个元素的值为a0
array+=0
# 结果为 a0 b c e f
echo ${a[@]}
但是呢,我们其实可以通过数组名的方式向数组后面直接添加元素
array=(a b c e f)
# 向数组末尾添加元素 g h
array+=(g h)
# 结果为 a b c e f g h
echo ${a[@]}
删除数组
unset
命令用来清除变量,它也可以用于清除数组元素的变量。
例如,清除单一元素
# 清除数组的第一个元素
unset `array[0]`
数组元素的变量名必须用引号引起来,是为了防止shell执行路径名展开
清除整个数组
# 清除整个数组
unset array
大胃粥
发布了50 篇原创文章 · 获赞 30 · 访问量 400万+
私信
关注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。