shell 数组¶
普通数组¶
用整数作为数组索引的数组, 只支持一维数组, 下标由0开始, 且必须大于等于0.
- 数组的定义: 用括号来表示数组, 数组元素用”空格”符号分割开
array_name=(value0 value1 value2 value3)
#或者
array_name=(
value0
value1
value2
value3
)
#或者单独定义数组的各个分量
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
#举例:
arr_number=(1 2 3 4 5) #数字元素数组
arr_string=("abc" "edf" "sss") #字符串元素数组
arr_string=('abc' 'edf' 'sss') #字符串元素数组也可以用单引号
- 读取数组元素:${array_name[index]}
valuen=${array_name[2]} #读取数组的第三个元素
echo ${array_var[0]} #读取数组的第一个元素
index=5
echo ${array_var[$index]} #读取数组的第6个元素
- 以清单形式打印出数组中的所有值:${array_var[*]} 或 ${array_var[@]}
echo ${array_var[*]}
test1 test2 test3 test4 test5 test6
echo ${array_var[@]}
test1 test2 test3 test4 test5 test6
- 获取数组的长度, 即数组中元素的个数
#获取数组元素的个数
length=${#array_name[@]}
#或者
length=${#array_name[*]}
#取得数组单个元素的长度
lengthn=${#array_name[n]}
- 删除数组中的某个元素, 以及删除整个数组
#删除数组中第二个元素
unset array[1]
#删除整个数组
unset array
- 对数组某个下标进行赋值:
#要赋值的数组下标元素已经存在, 则会修改该元素
arr_number=(1 2 3 4 5)
arr_number[2]=100
echo ${arr_number[*]}
1 2 100 4 5
#要赋值的数组元素不存在,则会增加一个该下标的元素, 这里原来的下标最大为4, 加入下标13过后, 数组的长度变为6, 但是下标还是分别为0,1,2,3,4,13; 此时要取数组的最后一个值必须要用${arr_number[13]}
arr_number[13]=13
echo ${arr_number[*]}
1 2 100 4 5 13
#如果此时再对下标8进行赋值, 则会在13之前插入一个8, 会根据下标的顺序插入值, 而下标分别为0,1,2,3,4,8,13; 数组长度为7
arr_number[8]=8
echo ${arr_number[*]}
1 2 100 4 5 8 13
- 分片访问:${array[@]:offset:length}或者${array[*]:offset:length}
#offset可以为负数, 此时负号与冒号之间必须要有空格, length必须大于等于0
array=(0 1 2 3 4 5 6 7 8 9)
echo ${array[@]:4:2}
4 5
echo ${array[@]: -4:2}
6 7
echo ${array[@]:4:-2}
-bash: -2: substring expression < 0
- 模式替换:${array[@]/old/new}或者{array[*]/old/new}
array=(0 1 2 3 4 5 6 7 8 9)
echo ${array[@]/3/-3}
0 1 2 -3 4 5 6 7 8 9
echo ${array[@]} #原数组的值不变
0 1 2 3 4 5 6 7 8 9
- 数组的遍历
for v in ${arr_number[@]}; do
echo $v;
done
- 获取数组所有的索引: ${!array[*]} 或者 ${!array[@]}
array=(0 1 2 3 4 5 6 7 8 9)
array[20]=123
echo ${array[@]}
0 1 2 3 4 5 6 7 8 9 123
echo ${!array[*]}
0 1 2 3 4 5 6 7 8 9 20
关联数组¶
以字符串作为索引, 其中键是唯一的,值可以不唯一
- 关联数组的定义: 在使用关联数组之前,需要使用命令 declare -A array 进行显示声明
declare -A ass_array
ass_array=([index1]=val1 [index2]=val2)
#声明之后,可以用两种方法将元素添加到关联数组中
#1. 利用内嵌"索引-值"列表的方法,提供一个"索引-值"列表
ass_array=([index1]=val1 [index2]=val2)
使用独立的“索引-值”进行赋值:
ass_array[index1]=val1
ass_array[index2]=val2
declare -A fruits_value
fruits_value=([apple]='100dollars' [orange]='150 dollars')
- 获取关联数组的元素:
${ass_array[key]}
#如:
echo ${fruits_value[apple]}
- 关联数组的其他操作
| 语法 | 描述 |
|---|---|
| ${!array\[\*]} | 取关联数组所有键 |
| ${!array\[@]} | 取关联数组所有键 |
| ${array\[\*]} | 取关联数组所有值 |
| ${array\[@]} | 取关联数组所有值 |
| ${#array\[\*]} | 取关联数组的长度 |
| ${#array\[@]} | 取关联数组的长度 |