Linux 之数组
数组
和其他编程语言一样,Shell 也支持数组。数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。
Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。和 C++、Java、C# 等类似,Shell 数组元素的下标也是从 0 开始计数。
获取数组中的元素要使用下标[ ]
,下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。
遗憾的是,常用的 Bash Shell 只支持一维数组,不支持多维数组。一对圆括号表示数组,数组元素之间用空格符号分割
数组定义
root@master:~# arr=(1 2 3 4) //注意,赋值号=
两边不能有空格,必须紧挨着数组名和数组元素。
root@master:~# echo $arr //默认输出数组的第一个元素
1
数组里面可以包含不是同一类型的数据:
root@master:~# arr=(1 2 "my name is yjt")
添加数组元素:
root@master:~# arr[5]=1234 root@master:~# echo ${arr[5]} 1234
给特定的元素赋值
root@master:~# arr1=([1]=2 [3]=4 [5]=6) root@master:~# echo ${arr1[1]} 2
数组长度、元素与删除
获取数组元素:用${数组名[下标]} 得到数组元素(下标从0开始), 下标为*或者@得到整个数组内容
语法格式:${array_name[index]}
其中,array_name 是数组名,index 是下标
示例如下:
root@master:~# echo ${arr1[1]} //获取单个元素 2 root@master:~# echo ${arr1[*]} //获取所有元素 2 4 6
root@master:~# echo ${arr1[@]}
2 4 6
删除:通过unset数组[下标]可以清除相应的元素,不带下标则清除全部数据
root@master:~# echo ${arr1[1]} 2 root@master:~# unset arr1[1] root@master:~# echo ${arr1[1]} root@master:~# unset arr1 root@master:~# echo ${arr1[*]}
长度:用${#数组名[@或*]} 可以得到数组长度
root@master:~# arr=(1 2 3) root@master:~# echo ${#arr[*]} 3
获取数组元素的范围
直接通过 ${数组名[@或*]:起始位置:长度} 获取数组给定范围内元素,返回字符串,中间用空格分开
root@master:~# echo ${arr[*]:1:2} 2 3
root@master:~# echo ${arr[@]:1:2}
2 3
替换
${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子
root@master:~# echo ${arr[*]} 1 2 3 root@master:~# echo ${arr[*]/1/4} 4 2 3
关联数组
Bash支持关联数组,它可以使用字符串作为数组索引,有时候采用字符串索引更容易理解。
定义关联数组
声明某个变量为关联数组
root@master:~# declare -A arr_test
将元素添加到关联数组‘
方法一:利用内嵌索引-值列表的方法 root@master:~# declare -A arr_test root@master:~# arr_test=([name]=yjt [age]=22)
方法二:使用独立的索引-值进行赋值
root@master:~# declare -A arr_test1
root@master:~# arr_test1[name]=yjt
root@master:~# arr_test1[age]=22
列出数组索引
每一个数组都有一个索引用于查找。使用${!数组名[@或者*]}获取数组的索引列表
root@master:~# echo ${arr_test[*]} yjt 22 root@master:~# echo ${!arr_test[*]} name age
获取所有的键值对
#!/bin/bash declare -A arr_yjt arr_yjt=([name]=yjt [age]=22) for key in ${!arr_yjt[*]} do echo "$key ---> ${arr_yjt[$key]}" done
保存文件到yjt.sh
执行脚本文件:
root@master:~# bash yjt.sh name ---> yjt age ---> 22