Shell函数(二):数组

shell函数二-数组

  • 三、数组:
    • 1.数组的最大作用:
    • 2.应用场景:
    • 3.格式:
    • 4.数组的数据类型:
    • 5.获取数组的长度:
    • 6.数组切片:
    • 7.数据传参:
    • 8.冒泡排序:

三、数组:

1.数组的最大作用:

一次性定义多个变量。

2.应用场景:

获取数组长度,获取元素长度,遍历元素,元素切片,元素替换,元素删除。

3.格式:

(1)格式1:
[root@test1 ~]# wangz=(1 2 3 4 5)
[root@test1 ~]# echo ${wangz[*]}
1 2 3 4 5
(2)格式2:
[root@test1 ~]# arr=([0]=1 [1]=2 [2]=3)
[root@test1 ~]# echo ${arr[*]}
1 2 3
(3)格式3:
[root@test1 ~]# abc="1 2 3 4"
[root@test1 ~]# arr1=($abc)
[root@test1 ~]# echo ${arr[*]}
1 2 3

4.数组的数据类型:

(1)数据类型:

[root@test1 ~]# wangz=(1 2 3 4 5)
[root@test1 ~]# echo ${wangz[*]}
1 2 3 4 5

(2)字符类型:

[root@test1 ~]# wangz=(billkin pp chanbaek)
[root@test1 ~]# echo ${wangz[*]}
billkin pp chanbaek

5.获取数组的长度:

(1)获取:

[root@test1 ~]# wangz=(billkin pp chanbaek)
[root@test1 ~]# echo ${#wangz[*]}
3

(2)读取下标索引的值(下标索引从0开始):

[root@test1 ~]# wangz=(billkin pp chanbaek)

[root@test1 ~]# echo ${wangz[2]}
chanbaek

(3)数组遍历:

1.设置:
[root@test1 ~]# vim wangzz.sh
wang=(billkin pp chanyeol baekhyun troye)
for i in ${wang[*]}
do
echo $i
done
[root@test1 ~]# sh wangzz.sh 
billkin
pp
chanyeol
baekhyun
troye
2.遍历函数:
[root@test1 ~]# vim wang.sh

ky29=(billkin pp chanyeol baekhyun suho)
for i in ${ky29[*]}
do
useradd $i
echo 123456 | passwd --stdin $i
done

[root@test1 ~]# sh wang.sh
useradd:用户“billkin”已存在
更改用户 billkin 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“pp”已存在
更改用户 pp 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“chanyeol”已存在
更改用户 chanyeol 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“baekhyun”已存在
更改用户 baekhyun 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 suho 的密码 。
passwd:所有的身份验证令牌已经成功更新。

6.数组切片:

(1)格式:

[root@test1 ~]# bk=(1 2 3 4 5)
[root@test1 ~]# echo ${bk[*]:0:2} #从下标索引0开始的往后两位
1 2

(2)临时替换,永久替换:

1.临时替换:
[root@test1 ~]# bk=(1 2 3 4 5)
[root@test1 ~]# echo ${bk[*]/4/68}
1 2 3 68 5
[root@test1 ~]# echo ${bk[*]} #临时替换,重新打印即失效
1 2 3 4 5
2.永久替换:
[root@test1 ~]# bk=(1 2 3 4 5)
[root@test1 ~]# echo ${bk[*]}
1 2 3 4 5
[root@test1 ~]# bk=(${bk[*]/4/68})
[root@test1 ~]# echo ${bk[*]}
1 2 3 68 5

(3)删除数组:

1.整组删除:unset 数组名

2.删除单个元素:
[root@test1 ~]# bk=(pp rich handsome tall fat)
[root@test1 ~]# echo ${bk[*]}
pp rich handsome tall fat
[root@test1 ~]# unset bk[4] #unset 组名[下标索引]
[root@test1 ~]# echo ${bk[*]}
pp rich handsome tall

(4)增加:

1.指定下标索引添加:
[root@test1 ~]# echo ${bk[*]}
pp rich handsome tall
[root@test1 ~]# bk[4]=car
[root@test1 ~]# echo ${bk[*]}
pp rich handsome tall car
2.直接在最后添加:
[root@test1 ~]# echo ${bk[*]}
pp rich handsome tall car
[root@test1 ~]# bk[${#bk[*]}]=boat
[root@test1 ~]# echo ${bk[*]}
pp rich handsome tall car boat
3.直接增加:
[root@test1 ~]# echo ${bk[*]}
pp rich handsome tall car boat
[root@test1 ~]# bk+=(wife cat)
[root@test1 ~]# echo ${bk[*]}
pp rich handsome tall car boat wife cat

7.数据传参:

(1)格式:

[root@test1 ~]# vim shuju.sh
#!/bin/bash
fx () {
abc1=($(echo $@))
echo "数组的值:${abc1[*]}"

}
abc1=(`seq 1 10`)
fx ${abc1[*]}
[root@test1 ~]# sh shuju.sh
数组的值:1 2 3 4 5 6 7 8 9 10

(2)函数返回数组:

1.返回数组:
[root@test1 ~]# vim wangz.sh
test () {

abc1=(`echo $@`)
sum=0
for i in ${abc1[*]}
do
sum=$(($sum+$i))
done
echo "$sum"


}
abc=(1 2 3 4 5)
test ${abc[*]}
[root@test1 ~]# sh wangz.sh 
15
2.遍历数组后乘2:
[root@test1 ~]# vim wangz.sh
test () {

abc1=(`echo $@`)
for ((i=0;i<=$(($#-1));i++))
do
abc1[$i]=$((${abc1[$i]}*2))
done
echo "${abc1[*]}"


}
abc=(1 2 3 4 5)
test ${abc[*]}


[root@test1 ~]# sh wangz.sh 
2 4 6 8 10

8.冒泡排序:

(1)定义:类似与气泡上涌动作,把数据在数据中从小到大或从大到小排序,不停向前或向后移动。最小的在第一个位置,最大的在最后,每个数组都相比较,小的往左走,打的向后移。

(2)实操:

1.原理:做一个双层for循环,外循环控制排序轮次,内循环比较两个相邻元素的大小,来交换位置,比外循环小1位。

[root@test1 ~]# vim maopao.sh
#!/bin/bash
abc=(20 10 60 40 50 70)
len=${#abc[*]}  #获取数组长度
for ((i=1;i<$len;i++)) #外循环控制排序轮次
do
 for ((k=0;k<$len-1;k++))  #内循环比较相邻两个元素大小
 do
  first=${abc[k]}  #取第一个值
  j=$(($k+1))     #当前索引号加1
  second=${abc[$j]} #取第二个值
 if [ $first -gt $second ]
  then
   temp=$first  #把第一个值保存到临时变量中
   abc[$k]=$second
   abc[$j]=$first
 fi
done
done
echo ${abc[*]}
[root@test1 ~]# sh maopao.sh
10 20 40 50 60 70

(3)扩展:

将虚拟机已使用内存大小按从大到小冒泡排序:
[root@test1 ~]# vim maopao.sh
#!/bin/bash
abc=(`df -h | awk 'NR>1 {print $5}' | tr -d "%"`)
len=${#abc[*]}  
for ((i=1;i<$len;i++)) 
do
 for ((k=0;k<$len-1;k++))  
 do
  first=${abc[k]}  
  j=$(($k+1))     
  second=${abc[$j]} 
 if [ $second -gt $first ]
  then
   temp=$first  
   abc[$k]=$second
   abc[$j]=$first
 fi
done
done
echo ${abc[*]}
[root@test1 ~]# sh maopao.sh
100 7 4 2 1 1 0 0 0

你可能感兴趣的:(vim,linux,云计算,运维,网络)