bash数组

bash版本号

1
2
bash --version
GNU bash, version 4.2.46(2)-release

bash数组使用举例

数组声明赋值

1
2
3
4
5
6
7
8
9
10
11
# Declare array names
declare -a names # 也可以不用声明,直接采用数组的赋值方式赋值,bash能自动识别为数组

# 使用 [] 赋值
names[0]="john"
names[1]="lucy"

# 使用 () 赋值
names=("john" "lucy")
names=([0]="john" [1]="lucy")
names=([1]="jessica" [3]="hanmeimei") # 可以指定下标不连续

数组读取及遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 根据下标读取数组内容
names=([0]="lily" [1]="lucy" [3]="hanmeimei")
echo ${names[1]} # lucy
if [[ ${names[2]} =~ "" ]]; then echo "empty"; else echo "not empty"; fi # empty

# 打印数组中所有元素, 此时打印出来的内容的是字符串列表
echo ${names[@]} #lily lucy hanmeimei

# 打印数组中元素的索引列表
echo ${!names[@]} # 0 1 3

# 读取数组长度
# 上面定义的数组下标虽然不连续,但是数组长度仍为 3
echo ${#names[@]} # 3

# 遍历数组
for name in ${names[@]};do echo $name; done
# lily
# lucy
# hanmeimei

数组截取及组合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
names=('lilei' 'jack' 'hanmeimei' 'lily' 'lucy')

# 截取从索引 1 开始(包含索引 1)的后面 3 个元素
echo ${names[@]:1:3} # jack hanmeimei lily

# 如果未指定元素个数,则表示后面所有元素
echo ${names[@]:2} # hanmeimei lily lucy

# 两个数组组合
names1=('name1_1' 'name1_2')
names2=('name2_1' 'name2_2' 'name2_3')
names=(${names1[@]} ${names2[@]})
echo ${names[@]} # name1_1 name1_2 name2_1 name2_2 name2_3

# 数组中增加元素
names=('lily' 'lucy')
names=("${names[@]}" "hanmeimei")
echo ${names[@]} # lily lucy hanmeimei

删除数据中元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
names=('lily' 'lucy' 'hanmeimei' 'lilei' 'jack')
# 删除数组中索引为 1 的元素
unset names[1]
echo ${names[@]} # lily hanmeimei lilei jack
echo ${!names[@]} # 0 2 3 4

# 删除整个数组
unset names

# 使用数组截取然后重新组合方式删除元素
names=('lily' 'lucy' 'hanmeimei' 'lilei' 'jack')
names=(${names[@]:0:1} ${names[@]:2})
echo ${names[@]} # lily hanmeimei lilei jack
echo ${!names[@]} # 0 1 2 3

# 使用模式操作符删除数组中的元素
names=('lily' 'lucy' 'hanmeimei' 'lilei' 'jack')
names=(@{names[@]/lucy/})
echo ${names[@]} # lily hanmeimei lilei jack
echo ${!names[@]} # 0 1 2 3

数组元素值替换

1
2
3
4
5
6
7
8
9
# 使用数组下标赋值
names=('lilei' 'hanmeimei' 'lucy' 'lily')
names[1]='jessica'
echo ${names[@]} # lilei jessica lucy lily

#使用模式操作符进行内容替换
names=('lilei' 'hanmeimei' 'lucy' 'lily')
names=(${names[@]/hanmeimei/jessica})
echo ${names[@]} # lilei jessica lucy lily