shell编程(六)之数组

时间:2023-03-08 23:54:32
shell编程(六)之数组

数组: 存储多个元素的连续的内存空间

  索引: 编号从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[]="Tom"
# arr1[]="Jerry" # 一次赋值全部元素
arr1=("Tom" "Jack" "Jerry" "slace") # 只赋值特定元素
# arr1=([]="Tom" []="Jerry" []="Jack") # 省略下标默认显示第0个元素
echo $arr1 # Tom # 数组长度
echo ${#arr1[*]} #
echo ${#arr1[@]} #

示例:生成10个随机数,并找出其最大值和最小值

#!/bin/bash
declare -i max=
declare -i min=
declare -a arr for i in {..};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= 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[*]::}
# 偏移几个元素后所有元素
echo ${arr1[@]:} # 向数组追加元素
arr1[${#arr1[@]}]="chengkaihua"
arr1[${#arr1[@]}]="alen"
echo ${arr1[@]} # 删除数组元素
unset arr1[]
echo ${arr1[@]} # 显示最后一位
echo ${arr1[$[${#arr1[*]}-]]} 结果显示:
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= for i in {..};do
  arr[$i]=$RANDOM
done for ((i=;i<$[${#arr[*]}-];i++));do
  for ((j=;j<$[${#arr[*]}--$i];j++));do
    if [ ${arr[$j]} -gt ${arr[$[$j+]]} ];then
      let tmp=${arr[$j]}
      arr[$j]=${arr[$[$j+]]}
      arr[$[$j+]]=$tmp
    fi
  done
done
echo ${arr[@]}