数组
2023-1-19
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

 
数组(array)是一个包含多个值的变量。成员的编号从0开始,数量没有上限,也没有要求成员被连续索引。

创建数组

数组可以采用逐个赋值的方法创建。
ARRAY是数组的名字,可以是任意合法的变量名。INDEX是一个大于或等于零的整数,也可以是算术表达式。
创建一个三个成员的数组:
 
数组也可以采用一次性赋值的方式创建:
采用上面方式创建数组时,可以按照默认顺序赋值,也可以在每个值前面指定位置。
只为某些值指定位置,也是可以的:
 
定义数组的时候,可以使用通配符:
 
先用declare -a命令声明一个数组,也是可以的:
 
read -a命令则是将用户的命令行输入,存入一个数组:
 

读取数组

读取单个元素

读取数组指定位置的成员,要使用下面的语法。
上面语法里面的大括号是必不可少的,否则 Bash 会把索引部分[i]按照原样输出。
如果不加大括号,Bash 会直接读取$array首成员的值,然后将[0]按照原样输出。
 

读取所有成员

@*是数组的特殊索引,表示返回数组的所有成员。
 
这两个特殊索引配合for循环,就可以用来遍历数组。
@*放不放在双引号之中,是有差别的。
上面的例子中,数组activities实际包含5个成员,但是for...in循环直接遍历${activities[@]},导致返回7个结果。为了避免这种情况,一般把${activities[@]}放在双引号之中。
 
${activities[*]}不放在双引号之中,跟${activities[@]}不放在双引号之中是一样的。
${activities[*]}放在双引号之中,所有成员就会变成单个字符串返回。
所以,拷贝一个数组的最方便方法,就是写成下面这样:
这种写法也可以用来为新数组添加成员:
 

默认位置

如果读取数组成员时,没有读取指定哪一个位置的成员,默认使用0号位置。
 
引用一个不带下标的数组变量,则引用的是0号位置的数组元素。
上面例子中,引用数组元素的时候,没有指定位置,结果返回的是0号位置。
 

数组的长度

要想知道数组的长度(即一共包含多少成员),可以使用下面两种语法。
 
 
注意,如果用这种语法去读取具体的数组成员,会返回该成员的字符串长度:
 

提取数组序号

${!array[@]}${!array[*]},可以返回数组的成员序号,即哪些位置是有值的:
 
利用这个语法,也可以通过for循环遍历数组。
 

提取数组成员

${array[@]:position:length}的语法可以提取数组成员:
 
如果省略长度参数length,则返回从指定位置开始的所有成员:
 

追加数组成员

数组末尾追加成员,可以使用+=赋值运算符。它能够自动地把值追加到数组末尾。否则,就需要知道数组的最大序号,比较麻烦:
 

删除数组

删除一个数组成员,使用unset命令:
 
将某个成员设为空值,可以从返回值中“隐藏”这个成员:
注意,这里是“隐藏”,而不是删除,因为这个成员仍然存在,只是值变成了空值:
 
由于空值就是空字符串,所以下面这样写也有隐藏效果,但是不建议这种写法。
 
直接将数组变量赋值为空字符串,相当于“隐藏”数组的第一个成员:
 
unset ArrayName可以清空整个数组:
 

关联数组

Bash 的新版本支持关联数组。关联数组使用字符串而不是整数作为数组索引。
declare -A可以声明关联数组:
关联数组必须用带有-A选项的declare命令声明创建。相比之下,整数索引的数组,可以直接使用变量名创建数组,关联数组就不行。
 
访问关联数组成员的方式,几乎与整数索引数组相同。
 
  • 计算机基础
  • Linux
  • Shell脚本
  • 函数Shell环境和除错
    目录