zoukankan      html  css  js  c++  java
  • 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]#
  • 相关阅读:
    oracle的安装与plsql的环境配置
    Working with MSDTC
    soapui-java.lang.Exception Failed to load url
    Oracle 一个owner访问另一个owner的table,不加owner
    Call API relation to TLS 1.2
    Call API HTTP header Authorization: Basic
    VS2008 .csproj cannot be opened.The project type is not supported by this installat
    The changes couldn't be completed.Please reboot your computer and try again.
    Create DB Table View Procedure
    DB Change
  • 原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/13156060.html
Copyright © 2011-2022 走看看