文章目录
- 前言
- 数组的定义
- 关联数组(字典)
- 数组的常用操作
- 获取数组长度
- 获取数组中所有元素
- 数组中新增元素
- 删除数组中元素
- 删除整个数组
- 复制数组
- 拼接数组
- 加载文件内容到数组
- 遍历数组
- 结语
前言
在上一篇中讲了普通变量的定义和使用,在本篇中会讲解数组的定义和使用。
数组是shell编程中唯一原生数据结构,日常在shell编程中如果涉及到多个数据的存储和计算,就可以使用到数组。
另外在shell中数组仅支持一维数组,不支持多维,这点其实是由shell编程语言的定位所决定的,shell语言擅长一些自动化的处理,并不擅长处理太过复杂的数据。
数组的定义
shell中的数组是一种弱类型,因此并不要求数组中的元素类型都相同,同一个数组中的元素可以有字符串、整型和浮点数等。
数组的定义也有两种定义方式,一种是不使用关键字,如下:
# 定义数组
fruit_array=("apple" "peach" 1 3.14)# 也可以直接通过索引赋值来定义数组
test_array[1]="test str"
test_array[3]=12
另一种数组定义方式是使用declare关键字,如下:
# 使用declare定义
declare -a name_array
name_array[0]="tom"
name_array[1]="jerry"
注意事项:
- 数组的索引是从0开始的,这一点和java、c++等编程语言是一样的
- 数组定义的"="左右不能有空格
- 数组中允许有空值
关联数组(字典)
上面定义的数组,数组的索引默认都是使用了顺序的整数,其实在shell中数组的索引也可以是字符串。
通过这个特性我们就可以模拟出类似于Python中的字典数据结构和Java中的map数据结构。
定义方式如下:
# 使用declare定义关联数组
declare -A array
array=([name]="tom" [age]=3 [gender]=man)# 获取数组指定元素
${array[age]}
数组的常用操作
这里预先定义好一个数组,后面的操作都使用这个数组
declare -a fruit=("apple" "peach" "banana")declare -a animal=("dog" "cat" "cow")
获取数组长度
shell中通过 $# 操作符获取长度,如下
${#fruit[@]}
# 或者
${#fruit[*]}
获取数组中所有元素
${fruit[@]}
# 或者
${fruit[*]}
数组中新增元素
可以通过指定索引的方式新增元素,如下:
fruit[3]="orange"
fruit[4]="peer"
删除数组中元素
使用unset指令
# 删除fruit数组的第五个元素
unset fruit[4]
# 删除fruit数组的第四个元素
unset fruit[3]
删除整个数组
也是使用unset指令
# 删除fruit数组
unset fruit
复制数组
# 复制fruit数组
new_fruit=("${fruit[@]}")
拼接数组
# 拼接fruit数组和animal数组
new_array=("${fruit[@]}" "${animal[@]}")
加载文件内容到数组
我们可以读取文件的内容直接生成数组
# 假设我们有一个文件 fruit.txt 内容如下
cat fruit.txt
apple
peach
orange
# 读取 fruit.txt 到数组中
fruit_array=(`cat "fruit.txt"`)
注意事项:
- 读取fruit.txt 时并不是单引号
'
而是反引号`(键盘中左上角数字1左边的按键),在显示上单引号和反引号看起来差不多,一定要注意啊 - shell中的单引号表示字符串全引用,反引号表示执行命令获取执行结果
遍历数组
数组的遍历会使用到for循环,这里先做了解,后面的文章会详细讲解
#! /bin/bash
array=(Mon Tue Wed Thu Fri Sat Sun)# 通过循环结构遍历数组
for i in ${array[@]}
doecho $i
done
结语
关于数组的知识就先写这么多,这个系列会持续更新,欢迎大家多多支持。