• shell数组


    数组

    Shell 数组元素的下标也是从 0 开始计数。获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。

    常用的 Bash Shell 只支持一维数组,不支持多维数组。

    Shell 数组的定义
    在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。由此,定义数组的一般形式为:
    array_name=(ele1  ele2  ele3 ... elen)
    注意,赋值号=两边不能有空格,必须紧挨着数组名和数组元素。
    下面是一个定义数组的实例:
    nums=(29 100 13 8 91 44)
    
    Shell 是弱类型的,它并不要求所有数组元素的类型必须相同,例如:
    arr=(20 56 "http://c.biancheng.net/shell/")
    第三个元素就是一个“异类”,前面两个元素都是整数,而第三个元素是字符串。
    
    Shell 数组的长度不是固定的,定义之后还可以增加元素。例如,对于上面的 nums 数组,它的长度是 6,使用下面的代码会在最后增加一个元素,使其长度扩展到 7:
    nums[6]=88
    
    此外,你也无需逐个元素地给数组赋值,下面的代码就是只给特定元素赋值:
    ages=([3]=24 [5]=19 [10]=12)
    以上代码就只给第 3510 个元素赋值,所以数组长度是 3
    获取数组元素
    
    获取数组元素的值,一般使用下面的格式:
    ${array_name[index]}
    其中,array_name 是数组名,index 是下标。例如:
    n=${nums[2]}
    表示获取 nums 数组的第二个元素,然后赋值给变量 n。再如:
    echo ${nums[3]}
    表示输出 nums 数组的第 3 个元素。
    
    使用@或*可以获取数组中的所有元素,例如:
    ${nums[*]}
    ${nums[@]}
    两者都可以得到 nums 数组的所有元素。
    获取数组长度
    所谓数组长度,就是数组元素的个数。
    
    利用@或*,可以将数组扩展成列表,然后使用#来获取数组元素的个数,格式如下:
    ${#array_name[@]}
    ${#array_name[*]}
    其中 array_name 表示数组名。两种形式是等价的,选择其一即可。
    
    如果某个元素是字符串,还可以通过指定下标的方式获得该元素的长度,如下所示:
    ${#arr[2]}
    获取 arr 数组的第 2 个元素(假设它是字符串)的长度。
    回忆字符串长度的获取
    
    回想一下 shell 是如何获取字符串长度的呢?其实和获取数组长度如出一辙,它的格式如下:
    ${#string_name}
    string_name 是字符串名。
    shell 数组拼接合并
    所谓 shell 数组拼接(数组合并),就是将两个数组连接成一个数组。
    
    拼接数组的思路是:先利用@或*,将数组扩展成列表,然后再合并到一起。具体格式如下:
    array_new=(${array1[@]}  ${array2[@]})
    array_new=(${array1[*]}  ${array2[*]})
    两种方式是等价的,选择其一即可。其中,array1 和 array2 是需要拼接的数组,array_new 是拼接后形成的新数组。
    
    下面是完整的演示代码:
    #!/bin/bash
    
    array1=(23 56)
    array2=(99 "http://www.beylze.com/d/file/20190908/1ix3hghjreu.html
    array_new=(${array1[@]} ${array2[*]})
    
    echo ${array_new[@]}  #也可以写作 ${array_new[*]}
    运行结果:
    23 56 99 http://www.beylze.com/d/file/20190908/wikbxcqy13l
    删除数组元素
    在 shell 中,使用 unset 关键字来删除数组元素,具体格式如下:
    unset array_name[index]
    其中,array_name 表示数组名,index 表示数组下标。
    
    如果不写下标,而是写成下面的形式:
    unset array_name
    那么就是删除整个数组,所有元素都会消失。
    关联数组也称为键值对(key-value)数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。
    
    例如,我们可以创建一个叫做 color 的关联数组,并用颜色名字作为下标。
    declare -A color
    color["red"]="#ff0000"
    color["green"]="#00ff00"
    color["blue"]="#0000ff"
    也可以在定义的同时赋值:
    declare -A color=(["red"]="#ff0000", ["green"]="#00ff00", ["blue"]="#0000ff")
    不同于普通数组,关联数组必须使用带有-A选项的 declare 命令创建。
    
    访问关联数组元素
    访问关联数组元素的方式几乎与普通数组相同,具体形式为:
    array_name["index"]
    例如:
    color["white"]="#ffffff"
    color["black"]="#000000"
    
    加上$()即可获取数组元素的值:
    $(array_name["index"])
    例如:
    echo $(color["white"])
    white=$(color["black"])
    获取所有元素的下标和值
    使用下面的形式可以获得关联数组的所有元素值:
    ${array_name[@]}
    ${array_name[*]}
    使用下面的形式可以获取关联数组的所有下标值:
    ${!array_name[@]}
    ${!array_name[*]}
    获取关联数组长度
    使用下面的形式可以获得关联数组的长度:
    ${#array_name[*]}
    ${#array_name[@]}
    关联数组实例演示:
    #!/bin/bash
    declare -A color
    color["red"]="#ff0000"
    color["green"]="#00ff00"
    color["blue"]="#0000ff"
    color["white"]="#ffffff"
    color["black"]="#000000"
    #获取所有元素值
    for value in ${color[*]}
    do
        echo $value
    done
    echo "****************"
    #获取所有元素下标(键)
    for key in ${!color[*]}
    do
        echo $key
    done
    echo "****************"
    #列出所有键值对
    for key in ${!color[@]}
    do
        echo "${key} -> ${color[$key]}"
    done
    运行结果:
    #ff0000
    #0000ff
    #ffffff
    #000000
    #00ff00
    ****************
    red
    blue
    white
    black
    green
    ****************
    red -> #ff0000
    blue -> #0000ff
    white -> #ffffff
    black -> #000000
    green -> #00ff00
    
    
    [root@snow zc]# declare -A color
    [root@snow zc]# color["red"]="#ff0000"
    [root@snow zc]# color["green"]="#00ff00"
    [root@snow zc]# color["blue"]="#0000ff"
    [root@snow zc]# echo ${color[@]}
    #ff0000 #0000ff #00ff00
    [root@snow zc]# echo ${!color[@]}
    red blue green
    [root@snow zc]#
  • 相关阅读:
    稳定性「三十六计」- 无状态化
    设置默认的超时和重试是一个基础设施的基本素养
    「前任的50种死法」开发踩坑案例--慢就是错
    稳定性「三十六计」- 配额管控
    编写代码的「八荣八耻」- 以开关上线为荣,以自信编码为耻
    Kubernetes的DaemonSet(下篇)
    使用Elasticsearch的动态索引和索引优化
    Kubernetes的DaemonSet(上篇)
    程序媛的人生观
    Kubernetes的污点和容忍(下篇)
  • 原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/13156060.html
Copyright © 2020-2023  润新知