Skip to content

Latest commit

 

History

History
216 lines (170 loc) · 4.1 KB

Array.md

File metadata and controls

216 lines (170 loc) · 4.1 KB

数组

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

1. 创建数组

写法:

# ARRAY 是数组的变量名。
# INDEX 是索引,一个大于等于零的整数,也可以是算术表达式。
ARRAY[INDEX]=value

创建一个三个成员的数组

# 写法一
array[0]=val1
array[1]=val2
array[2]=val3

# 写法二
array=(val1 val2 val3)
# 指定索引,如果不指定,则是默认索引
array=(val2 [2]=val1 [1]=val3)

# 写法三
array=(
  val1
  val2
  val3
)

定义数组的时候,可以使用通配符。

# 把当前目录下,所有 MP3 结尾的文件,放在一个数组
mp3s=( *.mp3 )

2. 读取数组

2.1 读取单个元素

读取数组某个位置的成员,使用下面的语法

# i 是索引
# 大括号不可省略
echo ${array[i]}

2.2 读取所有成员

@* 是数组的特殊索引,表示返回数组的所有成员。

foo=(a b c d e f g h i j)
echo ${foo[@]}
# or
echo ${foo[*]}

遍历数组

# 注意,遍历数组的时候,变量有没双引号,Bash 有区别,建议加上。
names=( Peter-Wang "Ali Alina Wang" San-Zhang "Si Li" )
for i in "${names[@]}"; do
  echo $i
done

# 上面输出 4 个元素
# 下面输出 7 个元素

for i in ${names[@]} ; do
  echo $i
done

拷贝数组

arr=(1 2 3 4 5)
arr2=("${arr[@]}" 6)
echo "${arr2[@]}"

2.3 默认位置

如果读取数组成员时,没指定读哪个位置,默认使用索引 0

declare -a foo
foo=A
echo ${foo[0]}

3. 数组的长度

检查数组长度,语法。

arr=(1 2 3)

${#arr[@]}
# or
${#arr[*]}

注意,用此语法去读某个元素的长度时,写法如下:

arr[100]=foo
${#arr[100]}
# 输出 3

4. 提取数组序号

提取数组中,有值的数组序号

arr=([5]=a [9]=b [23]=c)

${!arr[@]}

#or

${!arr[*]}

遍历数组有值元素例子:

arr=([5]=a [9]=b [23]=c)
for i in ${!arr[@]}; do
  echo ${arr[i]}
done

5. 提取数组成员

${array[@]:position:length} 的语法可以提取数组成员。

food=( apples bananas cucumbers dates eggs fajitas grapes )
echo ${food[@]:1:1}
# 输出 bananas

echo ${food[@]:1:3}
# 输出 bananas cucumbers dates

# 可以不输入长度,截取 position 后全部
echo ${food[@]:4}
# 输出 eggs fajitas grapes

6. 追加数组成员

可是使用 += 赋值运算,自动追加到数组末尾。

foo=(a b c)
foo+=(d e f)
echo ${foo[@]}
# 输出 a b c d e f

7. 删除数组

删除一个数组成员。注意:不影响索引。

以下办法:

  • 使用 unset 命令(推荐)
  • 对目标下标赋值为空值
foo=(a b c d)
# unset
unset foo[2]
echo ${foo[@]}
# 输出 a b d

# 赋空值
foo[2]=''
echo ${foo[@]}
# 输出 a b

# 输出数组头部成员
foo=''
echo ${foo[@]}
# 输出 b

删除整个数组。

arr=(a b c)
unset arr

含赋值下标删除的例子

8. 关联数组

新版本可以声明关联数组,实现非整数索引(类似编程语言中的Map)。

declare -A colors
colors["red"]="#ff0000"
colors["green"]="#00ff00"
colors["blue"]="#0000ff"

旧版本无法使用,暂不记录。