• Bash : 索引数组


    Bash 提供了两种类型的数组,分别是索引数组(indexed array)和关联数组(associative array)。本文主要介绍索引数组的基本用法。

    索引数组的基本特点

    Bash 提供的数组都是一维数组。
    任何变量都可以用作索引数组。
    通过 declare 关键字可以显式的声明一个索引数组。
    数组的大小是不受限制的。
    索引数组的元素的索引不必是连续的。
    通过从零开始的整数引用数组元素。
    除非另外注明,索引数组必须使用非负的整数索引元素。

    自动创建索引数组

    通过赋值语句可以隐式的创建索引数组:

    $ myArr[0]=apple

    通过给索引为 0 的元素赋值,变量 myArr 会被初始化成一个索引数组。
    当然也可以这样:

    $ myArr[3]=orange

    不用必须从索引 0 开始赋值。

    显式声明一个索引数组

    通过 declare 关键字和 -a 选项可以显式的声明索引数组:

    $ declare -a myArr

    然后进行初始化:

    $ myArr=(apple orange pear)

    也可以在声明的时候进行初始化:

    $ declare -a myArr=(apple orange pear)

    或者在声明后只初始化某个元素:

    $ myArr[0]=grape

    引用数组元素

    引用数组元素稍微麻烦些,不仅要指定元素的索引位置,还需要使用 ${} 符号。请注意,索引数组的下标从 0 开始,且不能为负数(真希望所有编程语言中的数组元素都从 0 开始索引!)。

    $ myArr[0]=apple
    $ echo ${myArr[0]}

    如果不小心引用了没有赋值的元素呢?不用担心,这里没有程序崩溃的问题,只不过没有输出内容而已:

    我们还可以轻松的输出数组的全部元素:

    $ declare -a myArr=(apple orange pear)
    $ myArr[10]=grape
    $ echo ${myArr[@]}

    第四个元素的索引是不连续的。我们可以获取到所有已经赋值元素的下标进行查看:

    $ echo ${!myArr[@]}

    变量也可以用来索引数组元素:

    $ declare -a myArr=(apple orange pear)
    $ i=2
    $ echo ${myArr[$i]}

    对于索引数组,如果你不按规矩引用数组元素可能产生一些诡异的状况。比如,用一个字符串代替非负的整数去索引元素会发生什么?

    $ declare -a myArr=(apple orange pear)
    $ echo ${myArr[hello]}

    这往往不是你想要的结果。实际上,无论你写什么样的字符串,都会被当做 0 来处理。

    添加数组元素

    比较常见的数组操作是在数组的尾部添加新的元素(严谨点说,这应该是队列的一个特征!):

    $ declare -a myArr=(apple orange pear)
    $ myArr=("${myArr[@]}" grape)
    $ echo ${myArr[@]}

    请注意最后一行的输出,这样添加的元素的索引是连续的。

    把两个数组连接成一个也是比较常见的操作:

    $ declare -a myAbc=(a b c)
    $ myArr=("${myArr[@]}" "${myAbc[@]}")
    $ echo ${myArr[@]}

    提取子数组

    提取部分数组元素:

    $ declare -a myArr=(a b c d e f g)
    $ echo ${myArr[@]:2:3}

    数组的长度

    在 Bash 中,引用数组长度的语法多少有些奇特:

    $ declare -a myArr=(apple orange pear)
    $ echo ${#myArr[@]}

    数组长度是指被赋值了的元素个数:

    $ myArr[10]=grape
    $ echo ${#myArr[@]}

    我们还可以获取到某个元素的长度:

    哈哈,看起来有些像二维数组了!

    遍历数组元素

    通过 for 语句可以像其它编程语言那样遍历数组中的元素:

    $ declare -a myArr=(apple orange pear)
    $ myArr[10]=grape
    $ for element in "${myArr[@]}"; do echo $element done

    删除数组元素

    $ declare -a myArr=(apple orange pear)
    $ unset myArr[1]
    $ echo ${myArr[1]}

    索引为 1 的元素已经为空了,其实数组的长度也发生了变化:

    $ echo ${#myArr[@]}

    此时数组的长度已经变成了 2。

    下面来个复杂点的:

    $ declare -a myArr=(a b c d e f)
    $ myArr=("${myArr[@]:0:3}" "${myArr[@]:4}")

    上面的代码移除了元素 d:

    清空数组

    $ declare -a myArr=(apple orange pear)
    $ unset myArr
    $ echo ${myArr[@]}

    OK,数组里已经没有元素了!

  • 相关阅读:
    流媒体传输协议之 RTP(下篇)
    我在春晚现场护航直播
    【邀请有礼】全球视频云创新挑战赛邀请有礼:参与 100% 获得 “壕” 礼,更有机会获得 JBL 音箱、Cherry 机械键盘
    流媒体传输协议之 RTMP
    WebRTC 音视频同步原理与实现
    阿里云联手 Intel 举办首届视频云挑战赛,40 万奖金邀你来战!
    你真的懂 MP4 格式吗?
    如何用 4 个小时搭建一个新 “Clubhouse” ,引爆声音社交新风口
    流媒体传输协议之 RTP (上篇)
    POJ 1655 Balancing Act【树形DP】POJ 1655 Balancing Act Balancing Act POJ 1655
  • 原文地址:https://www.cnblogs.com/sparkdev/p/7152164.html
Copyright © 2020-2023  润新知