数组: 存储多个元素的连续的内存空间
索引: 编号从0开始,属于数值索引
注意:索引也可支持使用自定义的格式,而不仅仅是数值格式
声明数组:
declare -a ARRAY_NAME
declare -A ARRAY_NAME: 关联数组,键值列表kv
数组元素的赋值:
1.一次只赋值一个元素
ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday"
weekdays[4]="Thursday"
2. 一次赋值全部元素
ARRAY_NAME=("VAL1" "VAL2" "VAL3" ...)
3.只赋值特定元素
ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)
4. read -a ARRAY
引用数组元素:${ARRAY_NAME[INDEX]}
注意: 省略[INDEX]表示引用下标为0的元素
#!/bin/bash declare -a arr1 # 声明普通数组 declare -A arr2 # 声明关联数组 # 数组赋值 # 一次赋值一个元素 # arr1[0]="Tom" # arr1[3]="Jerry" # 一次赋值全部元素 arr1=("Tom" "Jack" "Jerry" "slace") # 只赋值特定元素 # arr1=([0]="Tom" [3]="Jerry" [6]="Jack") # 省略下标默认显示第0个元素 echo $arr1 # Tom # 数组长度 echo ${#arr1[*]} # 4 echo ${#arr1[@]} # 4
示例:生成10个随机数,并找出其最大值和最小值
#!/bin/bash declare -i max=0 declare -i min=0 declare -a arr for i in {1..10};do arr[$i]=$RANDOM echo ${arr[$i]} if [ ${arr[$i]} -gt $max ]; then let max=arr[$i] else let min=arr[i] fi done echo "max is $max,min is $min"
练习: 写一个脚本: 定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件,要统计其下标为偶数的文件中的行数
#!/bin/bash declare -a arr declare -i sumlines=0 arr=(/var/log/*.log) for i in $(seq 0 1 $[${#arr[@]}-1]); do if [ $[$i%2] -eq 0 ]; then let sumlines+=`wc -l ${arr[$i]} | cut -d' ' -f1` fi done echo "下标为偶数的文件中的行数为$sumlines行"
引用数组中的元素
所有元素:${ARRAY[@], ${ARRAY[*]}}
数组切片: ${ARRAY[@]:offset:number}
offset:要跳过的元素个数
number:要取出的元素个数,偏移量之后的所有元素: ${ARRAY[@]:offset}
数组的长度(数组中元素的个数): ${#ARRAY_NAME[*]}, ${#ARRAY_NAME[@]}
向数组中追加元素:
ARRAY[${#ARRAY[*]}]
删除数组中的某元素:
unset ARRAY[INDEX]
关联数组:
declare -A ARRAY_NAME
ARRAY_NAME=([index_name1]='val1' [index_name2]='val2' ...)
# 引用数组中的元素 # 引用数组中所有元素 echo ${arr1[@]} echo ${arr1[*]} # 数组切片: ${arr1[@]:offset:number} # 偏移两个元素取一位 echo ${arr1[*]:2:1} # 偏移几个元素后所有元素 echo ${arr1[@]:1} # 向数组追加元素 arr1[${#arr1[@]}]="chengkaihua" arr1[${#arr1[@]}]="alen" echo ${arr1[@]} # 删除数组元素 unset arr1[2] echo ${arr1[@]} # 显示最后一位 echo ${arr1[$[${#arr1[*]}-1]]} 结果显示: Tom Jack Jerry slace Tom Jack Jerry slace Jerry Jack Jerry slace Tom Jack Jerry slace chengkaihua alen Tom Jack slace chengkaihua alen chengkaihua
练习:生成10个随机数,升序或降序排序
冒泡排序:
#!/bin/bash declare -a arr declare -i tmp=0 for i in {0..9};do arr[$i]=$RANDOM done for ((i=0;i<$[${#arr[*]}-1];i++));do for ((j=0;j<$[${#arr[*]}-1-$i];j++));do if [ ${arr[$j]} -gt ${arr[$[$j+1]]} ];then let tmp=${arr[$j]} arr[$j]=${arr[$[$j+1]]} arr[$[$j+1]]=$tmp fi done done echo ${arr[@]}