1. 数组
1.1 什么是数组
数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。
组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
用于区分数组的各个元素的数字编号称为下标。元素的下标从0开始。
数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。
1.2 数组的定义方法
- 法一
数组名=(value0 valuel value2 ...)
- 法二
数组名=([0]=value [1]=va1uc [2]=value ...)
- 法三
列表名="value0 valuel value2 ..."
数组名=($列表名)
- 法四
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
2. 数组包括的数据类型
- 数值类型
2. 字符类型:
使用" "或' '定义
3. 获取数组长度
[root@localhost ~]# arr_number=(1 2 3 4 5)
[root@localhost ~]# arr_length=$[#arr_number[*]]
${#arr_number[@]}
[root@localhost ~]# echo $arr_length
4. 获取数据列表
echo ${arr_number[*]}
echo ${arr_number[@]}
5. 读取某下标赋值
- 格式
arr_index2=${arr_number[2]}
echo $arr_index2
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# arr_index2=${arr[2]}
[root@localhost ~]# echo $arr_index2
6. 数组遍历
#!/bin/bash
arr_number=(1 2 3 4 5)
for v in $(arr_number[@]}
do
echo $v
done
7. 数组切片
格式:
${数组名[@或*]:起始位置(就是下标):长度]
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${arr[@]:2:3}
[root@localhost ~]# echo ${arr[@]:0:2}
8. 数组替换
- 格式
${数组名[@或*]/查找字符/替换字符)
- 法一
并不会替换数组原有内容
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${arr[@]/4/6)}
[root@localhost ~]# echo ${arr[@]}
- 法二
实现改变原有数组,可通过重新赋值实现
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# arr=(${arr[@]/4/6})
[root@localhost ~]# echo ${arr[@]}
9. 数组删除
- 格式
unset 数组名或数组名[*]
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr //删除数组
或
[root@localhost ~]# unset arr[*]
[root@localhost ~]# echo ${arr[@]}
- 删除数组元素
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr[2] //删除第三个元索
[root@localhost ~]# echo ${arr[*]}
10. 数组追加元素
10.1 法一
格式:
array_name[index1]=value
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# arr[5]=6
[root@localhost ~]# echo ${arr[*]}
10.2 法二
使用${#}算出它数组的个数,当作下标数进行添加。但是不适用于数组中间缺少某个数组数的
格式:
array_name[${#array_name[@]}]=value
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# arr[${#arr[@]}]=6
[root@localhost ~]# echo ${arr[@]}
- 不适用这个方法的数组例子
[root@localhost ~]# arr[0]=1
[root@localhost ~]# arr[1]=2
[root@localhost ~]# arr[3]=4
[root@localhost ~]# arr[4]=5
[root@localhost ~]# echo ${arr[@]}
1 2 4 5
[root@localhost ~]# arr[${#arr[@]}]=6
[root@localhost ~]# echo ${arr[@]}
1 2 4 6
10.3 法三
重新定义了一次数组
格式:
array_name=("${array_name[@]}" valne1...valueN)
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# arr=("${arr[@]}" 6 7)
[root@localhost ~]# echo ${arr[@]}
- 双引号不能省略,否则当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个
- 不能将@替换为*,如果替换为*,不加双引号时与@的表现一致,加双引号时,会将数组array_name中的所有元索作为一个元索添加到数组中
- 例如
[root@localhost ~]# arr=([0]="zhang san" [1]="li si")
[root@localhost ~]# echo ${arr[*]}
zhang san li si
[root@localhost ~]# echo ${#arr[*]}
2
[root@localhost ~]# arr1=(${arr[@]} "wang wu" "lao liu") //不加引号的话,他会把arr数组里的东西拆分单个的进行输出
[root@localhost ~]# echo ${arr1[*]}
zhang san li si wang wu lao liu
[root@localhost ~]# echo ${#arr1[*]}
6
[root@localhost ~]# arr2=("${arr[@]}" "wang wu" "lao liu") //加上引号,它会把数组正常输出
[root@localhost ~]# echo ${arr2[*]}
zhang san li si wang wu lao liu
[root@localhost ~]# echo ${#arr2[*]}
4
[root@localhost ~]# arr3=("${arr[*]}" "wang wu" "lao liu") //@替换成*,他会把整个数组当作一个整体输出
[root@localhost ~]# echo ${arr3[*]}
zhang san li si wang wu lao liu
[root@localhost ~]# echo ${#arr3[*]}
3
10.4 法四
- 格式
array_name+=(value1 ... valueN)
待添加元素必须用()包围起来,并且多个元素用空格分隔
[root@localhost ~]# arr=(10 20 30 40 50)
[root@localhost ~]# arr+=(60 70)
[root@localhost ~]# echo ${arr[*]}
11. 向函数传数组参数
11.1获取数组的数据列表作为函数的参数使用
如果将数组变量作为函数参数,函数只会取数组变量的第一个值。
- 举例
test1() {
echo "array: $@"
newarrary=($1)//在函数内把传入的列表重新组合成数组,写$1,否则只会输出数组的第一个元素
echo "新数组的值为: ${newarrary[*]}"
}
array=(3 2 1 4 5)
echo "原始数组的值为: ${array[*]}"
test1 $array
解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。
- 举例
test1() {
newarrary=($(echo $@))
echo "新数组的值为: ${newarrary[*]}"}
array=(3 2 1 4 5)
echo "原始数组的值为: S{array[*]}"
test2 ${array[*]}
11.2 使用for循环,令新数组内的每个元素值乘2
- i<=数组长度减1
#!/bin/bash
fun02 () {
#在函数内把传入的列表重新组合成数组
newarr=($@)
echo "新数组的值为:${newarr[@]}"
# ${#newarr[@]} 为数组的长度
for ((i=0;i<=${#newarr[@]}-1;i++))
do
newarr[$i]=$[${newarr[$i]}*2]
done
echo "每个元素值翻倍后为:${newarr[@]}"
}
#### main ####
arr=(1 2 3 4 5)
echo "原数组的值为:${arr[@]}"
#把数组转换成列表作为函数的参数使用
fun02 ${arr[@]}