【Shell】Shell编程——数组

文章介绍了在Shell中创建和操作数组的各种方法,包括定义、显示、获取长度、切片、替换、删除和追加元素。还展示了如何使用冒泡排序算法对数组进行排序,以及数组在函数中的应用。此外,文中给出了数组在实际问题中处理磁盘空间信息的例子。
摘要由CSDN通过智能技术生成

数组:数组当中的数据类型可以由用户自定义(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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值