数组
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的集合
数组名和索引
索引:编号从0开始,属于数值索引
注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,
八十的数组支持稀疏格式(索引不连续
声明数组:
Declare -a ARRAY_NAME
Declare -A ARRAY_NAME:关联数组
注意:两者不可相互转换
数组元素的赋值
- 一次只赋值一个元素ARRAY_NAME[INDEX]=VALUE weekdays[0]=”sunday weekdays[4]=”thursday”
- 一次赋值全部元素ARRAY_NAME=(“VAL1” “VAL2” “VAL3”..)
- 只赋值特定元素 ARRAY_NAME([0]=“VAL1”[3]=”VAL2..”)
- 交互式数组值对赋值 read -a ARRAYx
Title=({ceo coo cto ufo})
Num=({1..10})
Touch /app/f{1..10}.sh
File=({/app/f*.sh})
只要能生成列表,就可以放进去
交互式
Read -a teachers mage wang zhang
echo ${teachers[@]}
显示所有数组 :declare -a
引用数组元素
${ARRAY_NAME[INDEX]}
注意:省略[index]表示引用下标为0的元素
引用数组所有元素:
${ARRAY_NAME[*]}
${ARRAY_NAME[@]}
数组的长度(数组中的元素个数)
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
删除数组中的某个元素:导致稀疏格式
unset ARRAY[index]
删除整个数组: unset ARRAY
数组数据处理
关联数组 关联数组意思是下标时自定义的
Declare -A ARRAY_NAME
ARRAY_NAME=([IDX_NAME]=’VAL1’ [IDX_NAME2]=’VAL2’…)
关联数组必须先声明再调用
declare -A arr
Arr[a]=1
Arr[b]=2
Arr[c]=3
向数组中追加元素:
num={[1..10]}
unset num [3]
Num[3]=44
#!/bin/bash
declare -A disk
df|grep ‘/dev/sd’ > df.log
while read line;do
index=`echo $line|cut -d ” ” -f1`
echo index=$index
per=`echo $line |sed -r ‘s/.* ([0-9]+)%.*/\1/’`
echo per=$per
disk[“$index”]=$per
echo ${disk[*]}
echo “========”
done < df.log
echo ${disk[*]}
注意:df linux服务器的文件系统的磁盘空间占用情况
df|grep ‘/dev/sd’ > df.log将grep取出来的数据重定向到df.log中,done < df.log 将文件中的数据送给read,read逐行读取数据进行处理,每次处理都打印相关的输出,最后跳出循环,打印数组所有值,
While开启一个子循环,它的父循环中的数据对子循环无效,因此要重新定义到df.log中,
数组数据处理
引用数组中的元素:
数组切片:${ARRYAY[@]:offset:number}
Offset:要跳出的元素个数
Number:要取出的元素个数
取偏移量之后的所有元素
${ARRAY[@]:offset}
num=({1..10})
{num[@]:3:4} 跳过3个取4个
向数组中追加元素:ARRAY[${#ARRAY[@]}]=VALUE
题目:生成10个随机数保存于数组中,并找出其最大值和最小值
#!/bin/bash
declare -a rand
for ((i=0;i<10;i++));do
rand[$i]=$RANDOM
[ “$i”-eq 0 ] && max=${rand[$i]} && min=${rand[$i]} && continue
[ ${rand[$i]} -gt $max ] && max=${rand[$i]} && continue
[ ${rand[$i]} -lt $min ] && min=${rand[$i]}
done
echo ${rand[*]}
echo “max:$max min:$min”
~
#!/bin/bash
declare -a rand
declare -i max=0
declare -i min=32767 #随机生成的数字,最大值时32767
for i in {0..9};do
rand[$i]=$RANDOM
echo ${rand[$i]}
[ ${rand[$i]} -gt $max ] && max=${rand[$i]}
[ ${rand[$i]} -lt $min ] && min=${rand[$i]}
done
echo “max:$max” “min:$min”
编写脚本,定义一个数组,数组中的元素是/var/log目录下所有已.log结尾的文件;统计出其下方为偶数的文件中的行数之和
#!/bin/bash
#
declare -a files
files=(/var/log/*.log)
declare -i lines=0
for i in $(seq 0 $[${#files[*]}-1]);do
if [ $[$i%2] -eq 0 ];then
let lines+=$(wc -l ${files[$i]} | cut -d’ ‘ -f1)
fi
done
echo “lines: $lines.”
题目,将下图所示,实现转置矩阵matrix.sh
#!/bin/bash
declare -A matrix=([00]=1 [01]=2 [02]=3 [10]=4 [11]=5 [12]=6 [20]=7 [21]=8 [22]=9)
size=3
showmatrix(){
for ((i=0;i<size;i++));do
for((j=0;j<size;j++));do
echo -n “${matrix[$i$j]} ”
done
echo
done
}
echo “Before convert”
showmatrix
for ((i=0;i<size;i++));do
for((j=i;j<size;j++));do
if [ $i -ne $j ];then
temp=${matrix[$i$j]}
matrix[$i$j]=${matrix[$j$i]}
matrix[$j$i]=$temp
fi
done
echo
done
echo “After convert”
showmatrix
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/90783