1. 从定义数组开始
方法①-without index
# format
array=(value0 value1 value2 ···)
# format example
# right √ : array=(x x x)
$ array=(aa 123 bb cc dd)
# wrong × : array = (x x x)
$ array = (aa 123 bb cc dd)
bash: syntax error near unexpected tokken `('
# Example
$ array=(aa 123 bb cc dd)
# ${array[*]} will return all elements of this array
$ echo ${array[*]}
aa 123 bb cc dd
# ${array[@]} will return the same as "*"
$ echo ${array[@]}
aa 123 bb cc dd
方法②-通过索引定义数组
# format
array=([0]=value [1]=value [2]=value ···)
# example
$ echo ${array[@]}
100 200 300
# 删除此数组变量
unset array
# format,除了字符类型外,同样适用与数值类型
array[0]="11"
array[2]="22"
array[4]="55"
# example
$ echo ${array[*]}
11 22 55
# 获取数组的所有下标是取反,可以观察数组的连续情况
$ echo ${!array[*]}
0 2 4
方法③-字符串数组(以空格分割)
# format
array="value0 value1 value2 ···"
# example
array="01 02 03 04"
$ echo ${array[*]}
01 02 03 04
小结
- shell中的数组数据类型分为数值和字符串,分别通过a=(), a=" "(or a=‘’)两种方式来定义
- 可以通过指定索引的方式精准定义数组内元素,此方式可集中进行、可分散进行。可通过${!array[@]}来查看数组的索引,从而观察索引是否连续
- $ {array[@]}、${array[*]} 返回数组内所有元素
2. 具体实例介绍用法
#!/bin/bash
echo "requir-1: 定义数值数组,元素从1~10。"
arr=(1 2 3 4 5 6 7 8 9 10) # done-1
# index:0 1 2 3 4 5 6 7 8 9
echo "requir-2: 通过数组切片,打印整个数组。"
echo ${arr[@]} # , ${arr[*]} 同样可行。相当于切片:${arr[@]:0:9}
echo "requir-3: 遍历打印数组"
for i in ${arr[*]}
do
echo $i
done
echo "requir-4: 打印数组索引,观察是否连续"
echo ${!arr[@]}
echo "requir-5: 通过数组切片,从索引6开始,取2位。"
echo ${arr[@]:6:2} # 从索引为6起,切2个元素
echo "requir-6: 打印指定索引为8的元素"
echo ${arr[8]}
echo "requir-7: 通过数组切片,从索引8开始,取1位。"
echo "${arr[@]:8:1}" # 从索引为8起,切1个元素
echo "requir-8:将索引为0的元素数值替换为111"
arr[0]=111
echo ${arr[@]}
echo "requir-9: 定义数组array_test:10,20,30,40,50。"
arr_test=(10 20 30 40 50)
echo "arr_test= ${arr_test[@]}"
echo "requir-10: 打印时,将这个数组所有数值里的“0”替换为“9”"
echo "arr_test= ${arr_test[@]}"
echo ${arr_test[@]/0/9}
echo "requir-11: 永久的,将这个数组所有数值里的“0”替换为“9”"
echo "arr_test= ${arr_test[@]}"
arr_test1=${arr_test[*]/0/9}
arr_test=($arr_test1) # 注意!!!此处是 ($arr)
echo ${arr_test[@]}
echo "requir-12: 先删除索引为0的元素,然后删除数组array_test"
unset arr_test[0]
echo ${arr_test[@]}
unset arr_test
echo "arr_test is ${arr_test[@]} ..."
echo "requir-13: 给数组arr增加一个元素,数值=99,索引=10"
arr[10]=99
echo ${!arr[@]}
echo ${arr[@]}
echo "requir-14: 根据数组长度,使用索引给数组直接添加元素:88"
arr[${#arr[*]}]=88
echo ${!arr[@]}
echo ${arr[@]}
echo "requir-15: 使用重新定义的方式,连续增加三个元素:(12,12), (13,13), (14,14),左索引右数值。"
arr=("${arr[@]}" 12 13 14)
echo ${!arr[@]}
echo ${arr[@]}
echo "requir-16: 在数组的尾巴处,直接添加1个元素:15"
arr+=(15)
echo ${!arr[@]}
echo ${arr[@]}
echo "requir-17: 在数组的尾巴处,直接添加2个元素:16,17"
arr+=(16 17)
echo ${!arr[@]}
echo ${arr[@]}
$ bash test.sh
requir-1: 定义数值数组,元素从1~10。
requir-2: 通过数组切片,打印整个数组。
1 2 3 4 5 6 7 8 9 10
requir-3: 遍历打印数组
1
2
3
4
5
6
7
8
9
10
requir-4: 打印数组索引,观察是否连续
0 1 2 3 4 5 6 7 8 9
requir-5: 通过数组切片,从索引6开始,取2位。
7 8
requir-6: 打印指定索引为8的元素
9
requir-7: 通过数组切片,从索引8开始,取1位。
9
requir-8:将索引为0的元素数值替换为111
111 2 3 4 5 6 7 8 9 10
requir-9: 定义数组array_test:10,20,30,40,50。
arr_test= 10 20 30 40 50
requir-10: 打印时,将这个数组所有数值里的“0”替换为“9”
arr_test= 10 20 30 40 50
19 29 39 49 59
requir-11: 永久的,将这个数组所有数值里的“0”替换为“9”
arr_test= 10 20 30 40 50
19 29 39 49 59
requir-12: 先删除索引为0的元素,然后删除数组array_test
29 39 49 59
arr_test is ...
requir-13: 给数组arr增加一个元素,数值=99,索引=10
0 1 2 3 4 5 6 7 8 9 10
111 2 3 4 5 6 7 8 9 10 99
requir-14: 根据数组长度,使用索引给数组直接添加元素:88
0 1 2 3 4 5 6 7 8 9 10 11
111 2 3 4 5 6 7 8 9 10 99 88
requir-15: 使用重新定义的方式,连续增加三个元素:(12,12), (13,13), (14,14),左索引右数值。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
111 2 3 4 5 6 7 8 9 10 99 88 12 13 14
requir-16: 在数组的尾巴处,直接添加1个元素:15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
111 2 3 4 5 6 7 8 9 10 99 88 12 13 14 14
requir-17: 在数组的尾巴处,直接添加2个元素:16,17
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
111 2 3 4 5 6 7 8 9 10 99 88 12 13 14 14 15 16
3. 向函数传递数组参数
test1 (){
echo "函数接收到的参数列表为:$@"
newarr=($@)
echo "新数组的值为:${newarr[@]}"
sum=0
for i in ${newarr[@]}
do
sum=$[$sum + $i]
done
echo "数组所有元素的累加值为:$sum"
}
arr=(10 20 30 40 50)
echo "原始数组的值为:${arr[@]}"
test1 ${arr[*]} # 调用函数的时候直接跟追数组的所有返回值!
4. 数组排序算法
具体请查看 封玖FJ 的博客:《Shell脚本之数组(数组排序算法)》
参考文章:
封玖FJ 的博客:《Shell脚本之数组(数组排序算法)》