一、数组的概念
在shell脚本中一般我们一个变量名对应一个变量值
[root@node5 ~]# name=zhangsan
[root@node5 ~]# echo $name
zhangsan
[root@node5 ~]# name=$HOSTNAME
[root@node5 ~]# echo $name
node5
[root@node5 ~]# name=$HOSTTYPE
[root@node5 ~]# echo $name
x86_64
如果在shell中让一个变量有多个指,那就需要shell中的数组
二、数组的定义
1.语法格式
数组名=(第一个值 第二个值 第三个值 第四个值......)
2.定义数组示例
#一个值全部是数字的数组arr
[root@node5 ~]# arr=(10 11 12 13 14 15)
#一个值全部是字符串的数组arr1
[root@node5 ~]# arr1=(zhangsan lisi wangwu xiaohong xiaoqiang xiaolan)
#引用命令的执行结果作为数组
[root@node5 ~]# username=($(head -10 /etc/passwd |awk -F: '{print $1}'))
三、查看数组的值
1.查看数组内的所有值
语法:
echo ${数组名[*]}
或者
echo ${数组名[@]}
示例
#查看arr所有的值
[root@node5 ~]# echo ${arr[*]}
10 11 12 13 14 15
[root@node5 ~]# echo ${arr[@]}
10 11 12 13 14 15
#查看arr1所有的值
[root@node5 ~]# echo ${arr1[*]}
zhangsan lisi wangwu xiaohong xiaoqiang xiaolan
[root@node5 ~]# echo ${arr1[@]}
zhangsan lisi wangwu xiaohong xiaoqiang xiaolan
#查看username所有的值
[root@node5 ~]# echo ${username[*]}
root bin daemon adm lp sync shutdown halt mail operator
[root@node5 ~]# echo ${username[@]}
root bin daemon adm lp sync shutdown halt mail operator
2.查看数组某个指定的值
为了能够准确的找到数组指定的值,数组的每一个值都对应一个"下标" 。通过下标就可以找到对应的值
数组的下标是从0开始计算的
语法:
echo ${数组名[下标]}
示例:
[root@node5 ]# echo ${arr[*]}
10 11 12 13 14 15
#查看数组的第0个元素
[root@node5 ]# echo ${arr[0]}
10
#查看数组的第1个元素
[root@node5 ]# echo ${arr[1]}
11
#查看数组的第2个元素
[root@node5 ]# echo ${arr[2]}
12
四、查看数组中元素的个数
1.语法:
echo ${#数组名[*]}
2.示例
[root@node5 ]# echo ${arr[*]}
10 11 12 13 14 15
[root@node5 ]# echo ${#arr[*]}
6
五、向数组中添加元素
1.语法
数组名[下标]=值
2.示例
[root@node5 ~]# test=(1 2)
[root@node5 ]# echo ${test[@]}
1 2
#插入一个元素为3的元素
[root@node5 ~]# test[2]=3
[root@node5 ~]# echo ${test[@]}
1 2 3
3.示例2
示例2中向数组中添加元素的时候 需要知道没有数据的下标,这样就比较麻烦。我们可以通过以下方式添加值
[root@node5 ~]# echo ${test[@]}
1 2 3
[root@node5 ~]# test[${#test[@]}]=4
[root@node5 ~]# echo ${test[@]}
1 2 3 4
六、删除数组中的元素
1.语法:
unset 数组名[下标]
2.示例
[root@node5 ~]# echo ${test[@]}
1 2 3 4
[root@node5 ~]# unset test[3]
[root@node5 ~]# echo ${test[@]}
1 2 3
3.注意:
[root@node5 ~]# echo ${arr[*]}
10 11 12 13 14 15
[root@node5 ~]# unset arr[1]
[root@node5 ~]# echo ${arr[*]}
10 12 13 14 15
#这里删除了arr[1]的值,这里输出 也没有了arr[1]的值。但是我们单独输出就会出现已下情况
[root@node5 ~]# echo ${arr[0]}
10
[root@node5 ~]# echo ${arr[1]}
[root@node5 ~]# echo ${arr[2]}
12
#我们发现arr[1]的值变成了空。这需要重新赋值一下。空值就没有了
[root@node5 ~]# arr=(${arr[@]})
[root@node5 ~]# echo ${arr[0]}
10
[root@node5 ~]# echo ${arr[1]}
12
七、脚本实例
以下两个脚本结合使用
1.创建fio配置文件的脚本
#!/bin/bash
blok_size=(4 8 16)
blok_len=${#blok_size[*]}
rw_proportion=(20 40 60 80)
rw_pro_len=${#rw_proportion[*]}
for ((j=0;j<blok_len;j++));do
for i in {1..4};do
read=$(expr $read + 20)
write=$(expr 100 - $read)
cat >> ./fio-rand-RW-${blok_size[$j]}K-read"$read"-write"$write".fio << END
[global]
name=fio-rand-RW
filename=fio-rand-RW
rw=randrw
rwmixread=$read
rwmixwrite=$write
bs=${blok_size[$j]}K
direct=1
numjobs=16
time_based=1
runtime=900
[file1]
size=10G
ioengine=libaio
iodepth=16
END
done
read=0
write=0
done
2.执行fio命令压测的脚本
#!/bin/bash
list=($(ls ./|grep "fio$"))
list_num=${#list[*]}
blok_size=(4 8 16)
rw_proportion=(20 40 60 80)
rw_proportion_num=${#rw_proportion[*]}
for ((f=0;f<${#blok_size[*]};f++));do
for ((k=0;k<$rw_proportion_num;k++));do
ret=$(expr $rw_proportion_num - $k - 1)
sudo touch "${blok_size[$f]}K-${rw_proportion[$k]}-${rw_proportion[$ret]}"
sudo chmod 777 "${blok_size[$f]}K-${rw_proportion[$k]}-${rw_proportion[$ret]
}" done
done
while [ $list_num -gt 0 ] ;do
for ((i=0;i<$list_num;i++));do
echo "$i ${list[$i]}"
done
echo -e "\n"
flag=$(expr $list_num - 1)
read -p "Please enter the serial number[0-$flag]:" count
if [ -z $count ];then
echo "Input content cannot be empty" && continue
elif [ $count -gt $flag ];then
echo "Serial number does not exist" && continue
fi
one=$(echo ${list[$count]} |awk -F"-" '{print $4}')
two=$(echo ${list[$count]} |awk -F"-" '{print substr($5,5)}')
three=$(echo ${list[$count]} |awk -F"-" '{print substr($6,6,2)}')
sudo /usr/bin/fio ${list[$count]} --output=$one-$two-$three
unset list[$count]
list=(${list[*]})
list_num=${#list[*]}
done