数组:数组当中的数据类型可以由用户自定义(int整型;string字符串)
同一数组,也可以是不同数据类型组成的元素集合
数组最大的作用:可以一次性定义多个变量
在shell中创建数组的方法
1.数组名=(元素1 元素2 元素3 ...) 多个元素之间用空格隔开
echo ${数组名[*]} 表示显示数组内的所有元素
例:
ky30=(1 2 3 4 5 6 7)
echo ${ky30[*]}
2.数组名=([索引下标]元素1 [索引下标]元素2 [索引下标]元素3)
ky30=([0]1 [1]2 [2]3)
echo=${ky30[*]}
[0] [1] [2] 为数组的索引下标,默认从0开始
3.一个一个赋值
ky30[0]=a
ky30[1]=b
ky30[2]=c
echo ${ky30[*]}
二、
echo ${#数组名[*]} 查看数组长度,有多少个元素
[root@test1 ~]# ky30=(1 2 3 4 5 6 7)
[root@test1 ~]# echo ${#ky30[*]}
7
echo ${ky30[2]} 打印数字下标为2的元素(打印数组第三个元素)
[root@test1 ~]# echo ${ky30[*]}
1 2 3 4 5 6 7
[root@test1 ~]# echo ${ky30[2]}
3
例题:
创建一个数组,里面定义5个元素,这五个元素写成批量添加用户的方式
[root@test1 opt]# vim shuzu.sh
#下面是在vim编辑器的操作
user=(test1 test2 test3 test4 test5)
for i in ${user[*]}
do
useradd $i
echo "123" | passwd --stdin $i
done
#写好后:wq保存退出
[root@test1 opt]# sh shuzu.sh #运行脚本
Changing password for user test1.
passwd: all authentication tokens updated successfully.
Changing password for user test2.
passwd: all authentication tokens updated successfully.
Changing password for user test3.
passwd: all authentication tokens updated successfully.
Changing password for user test4.
passwd: all authentication tokens updated successfully.
Changing password for user test5.
passwd: all authentication tokens updated successfully.
用户创建成功!
数组的切片
a=(1 2 3 4 5)
echo ${a[*]:2:2}
第一个":2" 表示索引下标
第二个":2" 表示步长;从当前索引位置开始,往后打印几位;不加则默认打印当前索引后的所有
例1:
[root@test1 opt]# a=(1 2 3 4 5)
[root@test1 opt]# echo ${a[*]:2:2}
3 4
例2:
[root@test1 opt]# a=(1 2 3 4 5)
[root@test1 opt]# echo ${a[*]:2}
3 4 5
数组的替换
替换数组当中的元素
x=(a b c d e)
echo ${x[*]/b/7} 临时替换,原数组的值不会改变
x=($x[*]/b/7) 永久替换,需要通过重新赋值来实现
/b 表示需要替换的元素
/7 表示替换成的内容
例:
[root@test1 opt]# x=(a b c d e)
[root@test1 opt]# echo ${x[*]/b/7}
a 7 c d e
删除数组
unset 数组名 删除整个数组
unset 数组名[2] 删除索引号为2的元素
例1:
[root@test1 opt]# x=(a b c d e)
[root@test1 opt]# echo ${x[*]}
a b c d e
[root@test1 opt]# unset x
[root@test1 opt]# echo ${x[*]}
例2:
[root@test1 opt]# x=(a b c d e)
[root@test1 opt]# unset x[3] #删除索引号为3的元素;即删除d
[root@test1 opt]# echo ${x[*]}
a b c e
数组追加元素
1.格式:数组名 [索引号]=元素内容
当索引位置已有时,会替换元素内容;当索引位置为空时则追加新元素
追加元素时,要按索引下标的顺序进行添加;不按顺序添加的话会有空值,不方便识别而且使用命令时会报错
2.格式:数组名 [${#数组名[*]}]=元素内容
默认会在数组的后一位索引添加元素
[root@test1 opt]# x=(a b c d e)
[root@test1 opt]# x[${#x[*]}]=m
[root@test1 opt]# echo ${x[*]}
a b c d e m
[root@test1 opt]# echo ${x[5]}
m
3.格式:数组名+=(元素1 元素2)
[root@test1 opt]# x=(a b c d e)
[root@test1 opt]# x+=(o p t)
[root@test1 opt]# echo ${x[*]}
a b c d e o p t
数组的应用
数组和函数之间的应用
数组作为参数传给函数
seq 1 2 10 表示从1开始;步长为2;打印到10
seq 10 -3 1 倒序:表示从10开始;步长为3;打印到1
***冒泡排序
把一个顺序混乱的数组,按照从小到大或者从大到小进行排序
冒泡排序双循环
外循环确定循环次数
内循环比大小,换位置
[root@test1 work7.15]# vim maopao.sh
#冒泡排序,从小到大排列
a=(20 50 30 70 40 10 60)
echo "原数组的排列顺序为:${a[*]}"
l=${#a[*]}
for ((k=1;k<$l;k++))
do
for ((i=0;i<=($l-1);i++))
do
if [[ a[i] -ge a[i+1] ]];then
x=${a[$i]}
a[i]=${a[$i+1]}
a[i+1]=$x
else
a[i]=${a[$i]}
a[i+1]=${a[$i+1]}
fi
done
done
echo "原数组的排列顺序为:${a[*]}"
:wq保存并退出
[root@test1 work7.15]# sh maopao.sh
原数组的排列顺序为:20 50 30 70 40 10 60
原数组的排列顺序为:10 20 30 40 50 60 70
[root@test1 work7.15]# vim dfh.sh
#
#将切片得到的值赋给A
A=$(df -h | awk 'NR>1 {print $5}' | tr -d "%")
#将竖着排列的内容横向排列
B=(`echo -n $A`)
echo "原数组为:${B[*]}"
l=${#B[*]}
for ((k=1;k<=$l-1;k++))
do
for ((i=0;i<=($l-1);i++))
do
if [[ B[i] -le B[i+1] ]];then
x=${B[$i]}
B[i]=${B[$i+1]}
B[i+1]=$x
else
B[i]=${B[$i]}
B[i+1]=${B[$i+1]}
fi
done
done
echo "现数组为:${B[*]}"
[root@test1 work7.15]# sh dfh.sh
原数组为:9 0 0 1 0 53 1 1 100
现数组为:100 53 9 1 1 1 0 0 0