zoukankan      html  css  js  c++  java
  • bash shell 中的数组

    简介

      bash shell 提供了两种一维数组,分别是 index array 和 associative array,常见的翻译是索引数组和关联数组。任何变量都可以用作数组,也就是说如果你使用了数组赋值的语法操作变量(name[subscript]=value),则变量默认会转换为索引数组。同时你也可以使用declare显示地定义数组。比如declare -a array。

    index array 和 associative array 的区别

      <1> 定义方式不同

        index  array, 可以是自动生成或者显示指定变量为数组: declare -a index_array

        associative array, 必须显示指定变量为关联数组: declare -A associative_array

      <2> index array 的下标必须是大于0的数字或者可以计算出大于0数字的逻辑表达式,而associative array 的下标可以是字符串

        

        输出了以下结果,可以看到index array的下标0的值被覆盖了一次。如果脚本设置了 set -u, 那么给index array 下标使用字符串这种操作还会导致脚本报错并且停止。

        

    基本使用方法

      对于 index array 和 associative array 的使用,只需要注意 index array 的 key 不要使用字符串即可。当然也不是绝对不可以使用,只不过会出现上面描述的错误而已。

      <1> 初始化

        对于 index array    name=(value1 value2 value3)

        对于 associative array     name=([key1]=value1  [key2]=value2   [key3]=value3)

      <1> 获取数组元素个数

        elem_count=${@name[@]}

      <2> 引用数组中的元素

        value=${name[$key]}

      <3> 数组元素赋值

        name[$key]=value

      <4> 输出所有的键

        keys=${!name[*]}  或者  keys=${!name[@]}

      <5> 输出所有的值

         values=${name[*]} 或者 values=${name[@]}

      <6> 删除数组元素

        unset name[$index]   删除某个元素

        unset name  删除整个数组

      <7> 获取数组的一部分

        注意这个功能只有 index array 适用

        ${name:0:3}

        0是起始下标,3是元素个数。获取从下标0开始的3个元素。

        如果起始下标超过元素个数,则什么也不会输出

        如果起始下标是负数,则会输出错误的字符串(为什么这么输出我没有去研究,有兴趣可以试下)

      <8> 连接2个数组

        注意只有 index array 可以这样操作,如下面的代码

        

        输出:

         

      <9> 遍历数组以及使用 * 和 @ 的区别

        看以下代码:

        

        输出如下:

        

        使用 * 和 @, 只有二者被双引号包围起来的时候才会有区别。可以使用 * 的时候,解释出的东西会被当成一个字符串,可以看到遍历的时候数组中所有的键被IFS的第一个字符(空格)隔开,并当成一个字符串输了出来。但是使用@,每个键则会被单独解释。这个规则对于数组的值来说也是一样的。遍历数组的时候这里需要特别注意一下。

    其他的使用技巧

      declare 命令对变量设置属性也可以和数组配合起来使用,declare设置的变量属性会作用于数组的每一个值上。如以下代码,设置数组中每个值为只读:

      

      输出:

      

      也可以使用 -i 设置值必须为整数,使用-u设置值里面所有的字母都必须为大写等等。

      

  • 相关阅读:
    [GoogleInterview]连续子序列问题
    [Codeforces #615 div3]1294E Obtain a Permutation
    重识线段树——Let's start with the start.
    [易语言][ExDui][Tutorial]1.NameSelector
    [LuoguP1025][数据加强]数的划分
    [易语言][ExDui][Tutorial]0.Hello,world!
    Hello,cnblog!
    棋牌覆盖问题(分治)
    UVA 11732题解
    LA 3942Remember the Word
  • 原文地址:https://www.cnblogs.com/MyOnlyBook/p/9419521.html
Copyright © 2011-2022 走看看