得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

bash 中的数组和数组

定这个标题的时候还是过了一下脑子的,本来想叫它 “bash 中的数组和字典”,但是转念一想,在 bash 中,似乎并不是直接叫它们数组和字典,而是称之为 indexed arrays 和 associative arrays,所以就改成了 “bash 中的数组和数组” 了

1
2
3
4
# 使用方法
$ declare -a array_name
$ declare -A array_name # 关联数组,bash4.0 版本之后开始支持
# 注意:普通数组不用事先声明就可以使用,但关联数组必须提前声明才能使用,且两者不可相互转换

indexed arrays(数组)

创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 声明
$ declare -a char

# 创建空数组
$ char=()

# 赋值创建
$ char=(a b c q w x y z)

# 指定索引号,索引号不连续的也叫稀疏数组
$ char=([0]="a" [1]="b" [20]="c" [21]="d")

# 指定索引号,且单独定义
$ char[0]="a"

# 通配符
$ char=(*)

# 显示定义并初始化
$ declare -a char=([0]="a" [1]="b" [2]="c" [3]="q" [4]="w" [5]="x" [6]="y" [7]="z")

# for 循环初始化
# 多个数组合并为一个数组
# 等等

添加

1
2
3
4
5
6
7
8
9
10
# 添加一个
$ char+="d"

# 添加一个数组
$ char+=("d" "e" "f")

# 合并两个数组
$ char1=(a b)
$ char2=(c d e)
$ char=(${addr[@]} ${ages[@]})

访问

1
2
3
4
5
6
7
8
9
10
11
12
13
$ char=(a b c q w x y z)

# 下标访问
$ echo "${char[1]}"
b

# 分片访问
$ echo "${char[@]:3:2}"
q w

# 获取指定下标的元素值的字符个数
$ echo "${#char[3]}"
1

遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ char=(a b c q w x y z)

# 内置 declare -p 打印变量
$ declare -p char
declare -a char=([0]="a" [1]="b" [2]="c" [3]="q" [4]="w" [5]="x" [6]="y" [7]="z")

$ printf '%s' "${char[@]}"
abcqwxyz

# 显示 for 循环打印
$ for i in "${char[@]}"
$ do
$ echo "$i"
$ done

$ echo "${char[@]}"
a b c q w x y z

# 获取元素个数
$ echo ${#char[@]}
8

# 遍历数组的 index
$ for i in "${!char[@]}";
$ do
$ echo "${char[i]}"
$ done

# 类似 c 语言的遍历数组下标
$ char=(a b c q w x y z)
$ for ((i=0; i<${#char[@]}; i+=1));
$ do
$ echo "${char[i]}"
$ done

删除元素

1
2
3
4
$ char=(a b c q w x y z)
$ unset char[2]
$ declare -p char
declare -a char=([0]="a" [1]="b" [3]="q" [4]="w" [5]="x" [6]="y" [7]="z")

associative arrays(字典)

创建,除了使用前必须先声明,其他操作举一反三

1
$ declare -A char

summary

1
2
3
4
5
6
7
$ for i in "${char[@]}"  # 遍历数组的元素
$ for i in "${!char[@]}" # 遍历数组的下标
$ echo "${#char[@]}" # 获取数组的元素个数
$ echo "${char[*]}" # 一次性的打印成字符串整体
$ declare -a array # 定义一个数组
$ declare -A array # 定义一个字典
$ declare -p array # 打印遍历 array 的类型、值

be yourself, everyone else is already taken.