• shell编程之数组


    shell编程之数组

    1.什么是数组?

    Shell的数组就是把有限个元素(变量或字符内容)用一个名字命名,然后用编号对它们进行区分的元素集合。这个名字就称为数组名,用于区分不同内容的编号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。
    有了Shell数组后,就可以用相同名字引用一系列变量及变量值,并通过数字(索引)来识别使用它们。在许多场合,使用数组可以缩短和简化程序开发。
    数组的本质还是变量,是特殊的变量形式
    

    2.数组的操作

    2.1 数组的定义

    方法一:用小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格分隔

    array=(value1 value2 value3 ... )
    示例:
    array=(1 2 3)    #<==用小括号将数组内容赋值给数组变量,数组元素用“空格”分隔开。
    echo ${array[*]} #<==输出上面定义的数组的所有元素值,注意语法。
    

    方法二:用小括号将变量值括起来,同时采用键值对的形式赋值

    array=([0]=one [1]=two [3]=three [4]=four)
    

    方法三:通过分别定义数组变量的方法来定义

    [root@ci-node1 work]# arry[0]=one
    [root@ci-node1 work]# arry[1]=two
    [root@ci-node1 work]# arry[2]=three
    [root@ci-node1 work]# arry[3]=four
    [root@ci-node1 work]# echo ${arry[@]} #查看所有数组的值
    one two three four
    

    方法四:动态地定义数组变量,并使用命令的输出结果作为数组的内容

    array=($(命令))
    array=(`命令`)
    示例:
    [root@ci-node1 work]# arry=(`ls ./`)
    [root@ci-node1 work]# echo ${arry[@]}
    10.sh 172.16.1.7 1.sh 2.sh 3.sh 4.sh 5.sh 6.sh 7.sh 8.sh access_2010-12-8.log rsync.sh
    

    2.2 数组的打印

    array=(one two three)
    echo ${array[0]}  #<==打印单个数组元素用${数组名[下标]},当未指定数组下标时,数组的下标是从0开始。
    one
    echo ${array[1]}
    two
    echo ${array[2]}
    three
    echo ${array[*]}   #<==使用*或者@可以得到整个数组内容。
    one two three
    echo ${array[@]}   #<==使用*或者@可以得到整个数组内容。
    one two three
    

    2.2.1 打印数组元素的个数

    echo ${array[*]}   #<==使用*或者@可以得到整个数组内容。
    one two three
    echo ${#array[*]}  #<==用${#数组名[@或*]}可以得到数组长度,这和前文讲解的变量子串知识是一样的,因为数组也是变量,只不过是特殊的变量,因此也适合变量的子串替换等知识。
    3
    echo ${array[@]}   #<==使用*或者@可以得到整个数组内容。
    one two three
    echo ${#array[@]}  #<==用${#数组名[@或*]}可以得到数组长度
    3
    

    2.3 数组赋值

    直接通过“数组名[下标] ”对数组进行引用赋值,如果下标不存在,自动添加新一个数组元素,如果下标存在就覆盖原来的值

    [root@ci-node1 work]# array=(one two three)
    [root@ci-node1 work]# echo ${array[*]}
    one two three
    [root@ci-node1 work]# array[3]=four  #<==增加下标为3的数组元素
    [root@ci-node1 work]# echo ${array[*]}
    one two three four
    [root@ci-node1 work]# array[0]=oldboy  #<==修改数组元素
    [root@ci-node1 work]# echo ${array[*]}
    oldboy two three four
    

    2.4 数组的删除

    因为数组本质上还是变量,因此可通过“unset 数组[下标]”清除相应的数组元素,如果不带下标,表示清除整个数组的所有数据

    [root@ci-node1 work]# echo ${array[*]}
    oldboy two three four
    [root@ci-node1 work]# unset array[1]  #<==取消下标为1的数组元素
    [root@ci-node1 work]# echo ${array[*]}  #<==打印输出后发现数组元素“two”,不见了
    oldboy three four
    [root@ci-node1 work]# unset array  #<==删除整个数组
    [root@ci-node1 work]# echo ${array[*]}
                                             #<==没有任何内容了。
    [root@ci-node1 work]# 
    

    2.5 数组的截取与替换

    截取

    [root@ci-node1 ~]# arrary=(1 2 3 4 5)
    [root@ci-node1 ~]# echo ${arrary[@]:1:3 } #<==从下标为1的元素开始截取,共取3个数组元素
    2 3 4
    [root@ci-node1 ~]# arrary=({a..z})
    [root@ci-node1 ~]# echo ${arrary[@]}
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    [root@ci-node1 ~]# echo ${arrary[@]:3:3}  #<==从下标为1的元素开始截取,共取3个数组元素。
    d e f
    [root@ci-node1 ~]# echo ${arrary[@]:0:3}  #<==从下标为0的元素开始截取,共取3个数组元素
    a b c
    

    替换

    [root@ci-node1 ~]# arrary=(1 2 3 4)
    [root@ci-node1 ~]# echo ${arrary[@]}
    1 2 3 4
    [root@ci-node1 ~]# echo ${arrary[@]/2/oldoby} #<==把数组中的1替换成b,原数组未被修改,和sed很像。
    1 oldoby 3 4
    

    删除

    array=(one two three four five)
    echo ${array[@]}               
    one two three four five
    echo ${array[@]#o*}    #<==从左边开始匹配最短的,并删除。 
    ne two three four five
    echo ${array1[@]##o*}  #<==从左边开始匹配最长的,并删除。 
    two three four five
    echo ${array[@]%f*}    #<==从右边开始匹配最短的,并删除。 
    one two three
    echo ${array[@]%%f*}   #<==从右边开始匹配最长的,并删除。
    one two three
    

    3.Shell数组脚本开发实践

    3.1 使用循环批量输出数组的元素

    [root@ci-node1 scripts]# cat 15.sh 
    #!/bin/bash
    ##############################################################
    # File Name: 15.sh
    # Version: V1.0
    # Author: liu
    # Organization: 
    # Created Time : 2019-04-15 21:40:02
    # Description:
    ##############################################################
    #普通方式
    arrary=(1 2 3 4 5)
    for i in ${arrary[@]}
    do
        echo $i
    done
    #c语言方式
    arrary1=(1 2 3 4 5)
    for ((i=0;i<${#arrary1[@]};i++)) #<==从数组的第一个小标0开始,循环数组的所有下标
    do
        echo ${arrary1[i]} #<==打印数组元素
    done
    #while循环打印
    arrary2=(1 2 3 4 5)
    i=0
    while ((i<${#arrary2[@]}))
    do
        echo ${arrary2[i]}
        ((i++))
    done
    

    3.2 通过竖向列举法定义数组元素并批量打印。

    [root@ci-node1 scripts]# cat 16.sh 
    #!/bin/bash
    ##############################################################
    # File Name: 16.sh
    # Version: V1.0
    # Author: liu
    # Organization: 
    # Created Time : 2019-04-15 21:54:12
    # Description:
    ##############################################################
    arrary=(
        oldboy
        oldgirl
        xiaoting
        binggin
    )
    for ((i=0;i<${#arrary[*]};i++))
    do
        echo "This is num $i,then content is ${arrary[i]}"
    done
    

    3.3 把命令结果作为数组元素定义并打印

    [root@ci-node1 scripts]# cat 17.sh 
    #!/bin/bash
    ##############################################################
    # File Name: 17.sh
    # Version: V1.0
    # Author: liu
    # Organization: 
    # Created Time : 2019-04-15 21:58:58
    # Description:
    #############################################################
    arrary=(`ls /oldboy`)
    for ((i=0;i<${#arrary[*]};i++))
    do
        echo "This is num $i,then content is ${arrary[i]}"
    done
    echo  --------------------
    arrary1=($(ls /oldboy))
    num=0
    for i in ${arrary1[*]}
    do
        echo "This is num $num,then content is $i"
        ((num++))
    done
    

    4.shell数组命令总结

    1)定义命令

    静态数组:
    array=(1 2 3)
    动态数组:
    array=($(ls))或array=(`ls`)
    给数组赋值:
    array[3]=4
    

    2)打印命令

    打印所有元素:
    ${array[@]}或${array[*]}
    打印数组长度:
    ${#array[@]}或${#array[*]}
    打印单个元素:
    ${array[i]}                  #<==i是数组下标。
    

    3)循环打印的常用基本循环

    #!/bin/sh
    arr=(
        10.0.0.11
        10.0.0.22
        10.0.0.33
    )
    #C语言for循环语法
    for ((i=0;i<${#arr[*]};i++))
    do
        echo "${arr[$i]}"
    done
    echo ---------------
    #普通for循环语法
    for n in ${arr[*]}
    do
        echo "$n"
    done
    
  • 相关阅读:
    HDU4004The Frog's Games(二分求恰当的步长)
    HDU2899Strange fuction (二分)
    HDU4190Distributing Ballot Boxes
    HDU2059龟兔赛跑(加油站)
    HDU2594 Simpsons’ Hidden Talents (kmp找寻两串s1,s2中相同的部分)
    HDU1711Number Sequence (kmp找母串ns[]中子串ms[]第一次出现时,首位的位置)
    HDU1874畅通工程续(最短路模版)
    HDU3790最短路径问题
    1655 文本计算器
    具有相同元素的排列组合模板
  • 原文地址:https://www.cnblogs.com/yjiu1990/p/10748237.html
Copyright © 2020-2023  润新知