• Shell入门-Shell数组


    Shell数组

    通常在开发Shell脚本时,定义变量采用的形式为“a=1; b=2; c=3”,可如果有多个变量呢?这时再逐个地定义就会很费劲,并且要是有多个不确定的变量内容,也会难以进行变量定义,此外,快速读取不同变量的值也是一件很痛苦的事情,于是数组就诞生了,它就是为了解决上述问题而出现的

    Shell数组的定义

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

    语法:

    array=(arg1 arg2 arg3)
    

    实践:

    [root@localhost shell]# array=(1 2 3)
    [root@localhost shell]# echo ${array[*]}
    1 2 3
    

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

    语法:

    array=([1]=one [2]=two [3]=three)
    

    实践:

    [root@localhost shell]# array=([1]=one [2]=two [3]=three)
    [root@localhost shell]# echo ${array[*]}
    one two three
    [root@localhost shell]# 
    

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

    语法:

    array[0]=a;array[1]=b;array[2]=c
    

    实践:

    [root@localhost shell]# array[0]=a;array[1]=b;array[2]=c
    [root@localhost shell]# echo ${array[*]}
    a b c three
    [root@localhost shell]# 
    

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

    语法:

    array=($(命令))
    

    array=(`命令`)
    

    实践:

    [root@localhost shell]# ls stu*
    stu_102999_1.jpg  stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg
    [root@localhost shell]# array=($(ls stu*))
    [root@localhost shell]# echo ${array[*]}
    stu_102999_1.jpg stu_102999_2.jpg stu_102999_3.jpg stu_102999_4.jpg
    [root@localhost shell]# 
    

    Shell数组的打印

    1.打印数组元素

    [root@localhost shell]# array=(one two three)
    [root@localhost shell]# echo ${array[0]}
    one
    [root@localhost shell]# echo ${array[1]}
    two
    [root@localhost shell]# echo ${array[2]}
    three
    [root@localhost shell]# echo ${array[*]}
    one two three
    [root@localhost shell]# echo ${array[@]}
    one two three
    [root@localhost shell]# 
    

    2.打印数组元素的个数

    [root@localhost shell]# echo ${#array[*]}
    3
    [root@localhost shell]# echo ${#array[@]}
    3
    [root@localhost shell]# 
    

    3.数组赋值

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

    [root@localhost shell]# array[2]=four
    [root@localhost shell]# echo ${array[@]}
    one two four
    

    4.数组的删除

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

    [root@localhost shell]# unset array[2]
    [root@localhost shell]# echo ${array[@]}
    one two
    [root@localhost shell]# unset array
    [root@localhost shell]# echo ${array[@]}
    
    [root@localhost shell]# 
    

    5.数组内容的截取和替换

    这里和前文变量子串的替换是一样的,因为数组是特殊的变量。

    echo ${array[@]:0:2}表示从array数组的下标0开始获取2个元素

    [root@localhost shell]# array=(1 2 3 4 5)
    [root@localhost shell]# echo ${array[@]:1:3}
    2 3 4
    [root@localhost shell]# array=($(echo {a..z}))
    [root@localhost shell]# echo ${array[@]}
    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@localhost shell]# echo ${array[@]:1:3}
    b c d
    [root@localhost shell]# echo ${array[@]:0:3}
    a b c
    [root@localhost shell]# echo ${array[@]:0:2}
    a b
    [root@localhost shell]# 
    

    替换:

    [root@localhost shell]# echo ${array[@]/a/1}
    1 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@localhost shell]# array=(one two three four five)
    [root@localhost shell]# echo ${array[@]}
    one two three four five
    [root@localhost shell]# echo ${array[@]#o*}
    ne two three four five <===从左边开始匹配最短的数组元素,并删除
    [root@localhost shell]# echo ${array[@]##o*}
    two three four five <===从左边开始匹配最长的数组元素,并删除
    [root@localhost shell]# echo ${array[@]%f*}
    one two three <===从右边开始匹配最短的数组元素,并删除
    [root@localhost shell]# echo ${array[@]%%f*}
    one two three <===从右边开始匹配最长的数组元素,并删除
    [root@localhost shell]# 
    

    提示:数组也是变量,因此也适合于前面讲解过的变量的子串处理的功能应用。数组的其他相关知识可通过man bash命令然后搜“Arrays”来了解。

    Shell数组实践

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

    方法一:通过c语言型的for循环语句打印数组元素

    [root@localhost shell]# cat 13_1_1.sh 
    #!/bin/bash
    #***********************************************
    #Author:        luotianhao
    #Mail:          tianhao.luo@hand-china.com
    #Version:       1.0
    #Date:          2021-03-16
    #FileName:      13_1_1.sh
    #Description:   This is a test script.
    #***********************************************
    array=(1 2 3 4 5)
    for((i=0;i<${#array[*]};i++))
    do
        echo ${array[i]}
    done
    [root@localhost shell]# sh 13_1_1.sh 
    1
    2
    3
    4
    5
    

    方法二:通过普通for循环语句打印数组元素

    [root@localhost shell]# cat 13_1_2.sh 
    #!/bin/bash
    #***********************************************
    #Author:        luotianhao
    #Mail:          tianhao.luo@hand-china.com
    #Version:       1.0
    #Date:          2021-03-16
    #FileName:      13_1_2.sh
    #Description:   This is a test script.
    #***********************************************
    array=(1 2 3 4 5)
    for n in ${array[*]}
    do
        echo $n
    done
    [root@localhost shell]# sh 13_1_2.sh 
    1
    2
    3
    4
    5
    

    方法三:使用while循环语句打印数组元素

    [root@localhost shell]# cat 13_1_3.sh 
    #!/bin/bash
    #***********************************************
    #Author:        luotianhao
    #Mail:          tianhao.luo@hand-china.com
    #Version:       1.0
    #Date:          2021-03-16
    #FileName:      13_1_3.sh
    #Description:   This is a test script.
    #***********************************************
    array=(1 2 3 4 5)
    i=0
    while (( i<${#array[*]} ))
    do
        echo ${array[i]}
        ((i++))
    done
    [root@localhost shell]# sh 13_1_3.sh 
    1
    2
    3
    4
    5
    

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

    [root@localhost shell]# sh 13_2_1.sh 
    this is num 0,then content is oldboy
    this is num 1,then content is oldgirl
    this is num 2,then content is xiaoting
    this is num 3,then content is bingbing
    -----------------------------------
    array len:4
    [root@localhost shell]# cat 13_2_1.sh 
    #!/bin/bash
    #***********************************************
    #Author:        luotianhao
    #Mail:          tianhao.luo@hand-china.com
    #Version:       1.0
    #Date:          2021-03-16
    #FileName:      13_2_1.sh
    #Description:   This is a test script.
    #***********************************************
    array=(
    oldboy
    oldgirl
    xiaoting
    bingbing
    )
    
    for (( i=0;i<${#array[*]};i++  ))
    do
        echo "this is num $i,then content is ${array[$i]}"
    done
    echo -----------------------------------
    echo "array len:${#array[*]}"
    

    打印字母数不大于6的单词

    利用bash for循环打印下面这句话中字母数不大于6的单词i am oldboy teacher welcome to oldboy training class

    1.先把所有单词放入数组中,然后依次进行判断

    array=(i am oldboy teacher welcome to oldboy training class)
    

    2.计算变量内容的长度,常见有4种方法

    [root@localhost shell]# char=oldboy
    [root@localhost shell]# echo $char|wc -L
    6
    [root@localhost shell]# echo ${#char}
    6
    [root@localhost shell]# expr length $char
    6
    [root@localhost shell]# echo $char|awk '{print length ($0)}'
    6
    [root@localhost shell]# 
    

    或者使用awk循环实现

    [root@localhost shell]# array="i am oldboy teacher welcome to oldboy training class"
    [root@localhost shell]# echo $array|awk '{for(i=1;i<=NF;i++) if(length($i)<=6) print $i}'
    i
    am
    oldboy
    to
    oldboy
    class
    [root@localhost shell]# 
    
  • 相关阅读:
    软考-高项
    Env Navigator项目设计
    传统Winform系统的转小程序化设想
    .net 混淆和反混淆工具
    ObjectListView 使用技巧
    Dapr资料汇总
    Keycloak保护Spring Boot Restful API接口
    将B站英语教学视频转成mp3和课件
    Java: 如何将XML格式化
    Java: 非泛型类如何设计List<T>这样的属性
  • 原文地址:https://www.cnblogs.com/tianhao-luo/p/14543691.html
Copyright © 2020-2023  润新知