什么是数组
- 存储多个元素的连续的内存空间。数组只有一个名字,索引号从0开始。
- 关联数组的索引号可以自定义,bash4及以后版本支持关联数组。
- Bash 支持一维数组(不支持多维数组),并且没有限定数组的大小。
- 获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
如何定义一个数组
用括号表示数组,数组元素用 “空格” 符号分割开
使用 declare -a ips
定义一个名为 ips 的索引数组
1 | [user1@study ~]$ declare -a ips # 一般可以省略这条语句,直接使用下面的方法定义即可 |
使用 declare -A IPS
定义一个名为 IPS 的关联数组
1 | [user1@study ~]$ declare -A IPS |
元素赋值
单个元素赋值,直接通过 数组名[下标]
就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素
1 | [user1@study ~]$ ips=(1.2.3.4 9.9.9.9) # 全部元素赋值 |
特定元素赋值
1 | [user1@study ~]$ abc=([0]='123' [1]='456') |
使用命令替换赋值
1 | [user1@study ~]$ abc=( $(seq 10) ) |
交互式赋值,直接在提示符中写,写后回车即可
1 | [user1@study ~]$ read -a array_name |
关联数组赋值,直接给定下标名
1 | [user1@study ~]$ declare -A world |
元素值引用
引用时只给数组名,表示引用为下标为 0 的元素
1 | [user1@study ~]$ read -a array_name <<< "Tom Jerry yes no" |
使用 ${arrar_name[@]}
或 ${array_name[*]}
可以获取数组中的所有元素,区别是 *
是作为一个整体字符串,而 @
是把每个位置变量都分别作为独立的字符串
1 | [user1@study ~]$ array_name=( $(seq 10) ) |
数组长度引用
取得数组元素的个数
1 | length=${#array_name[@]} |
取得数组第一个元素的长度
1 | lengthn=${#array_name} |
取得数组单个元素的长度
1 | lengthn=${#array_name[n]} |
元素值提取
1 | [user1@study ~]$ a=(net.nf_conntrack_max=====131072 net.ipv4.ip_forward===1 c====5) |
获取元素下标
1 | [user1@study ~]$ array=(a b c d e f g) |
删除元素
直接通过:unset 数组[下标]
可以清除相应的元素;不带下标,清除整个数据
1 | [user1@study ~]$ a=( $(seq 10) ) |
元素切片
使用 ${array_name[@]:offset:number}
的格式来实现数组中元素的切片, 其中 offset
指的是要跳过元素的个数, number
指的是要取出元素的个数,省略 number
时,表示取偏移量之后的所有元素
对数组切片后返回的是字符串,中间用空格分开,因此如果切片后的结果加上 ()
,将得到切片数组
1 | [user1@study ~]$ a=(1 2 3 4 5) |
元素值替换
使用 ${array_name[@或*]/searchstr/replacestr}
的格式可以实现元素值的查找替换,其中 searchstr
指的是要查找的字符串, replacestr
指的是要替换成什么样的字符串
1 | [user1@study ~]$ a=(1 2 3 4 5) |
元素值替换操作不会改变原先数组的内容,如果需要修改则需要重新定义数据。
应用示例
设置内核参数
1 |
|