微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash数组

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 举报,一经查实,本站将立刻删除。

相关推荐