zoukankan      html  css  js  c++  java
  • bash shell数组使用总结

    本文为原创博文,转发请注明原创链接https://www.cnblogs.com/dingbj/p/10090583.html 

    数组的概念就不多说了,大家都懂!

    shell数组分为索引数组和关联数组,今天只说普通的索引数组。

    定义数组

    像很多脚本语言一样,shell变量不区分类型,对于普通数组,可申明也可以不申明:

    如果习惯使用声明,就使用declare 命令声明

      例如:declare -a myarray

    数组初始化在赋值语句的等号右侧,紧挨着用一对括号表示数组,数组中元素之间使用“空格”分隔。

    例如:

    myarray=()  #定义一个空数组

    myarray=(1 2 3 4 5)   #全部元素为数字

    myarray=(one two three four five)  #全部元素为字符串

    myarray=(1 two 3 three 4 five)  #元素由数值和字符串构成

    myarray=(1 two 3 “a phrase” 5 now)

    当然也可以直接为数组元素赋值来定义数组

    例如:

    myarray[0]=1

    myarray[2]=test

    myarray[3]="a phrase"

    ....

    引用操作数组

      既然数组是一个变量,当然引用时也得使用$符开头,但和普通标量变量不同,引用整个数组,需要使用${arr_name[*]}或${arr_name[@]}形式,否则使用$arr_name或者${arr_name}只会得到第一个元素。同样,和标量变量一样,数组变量也可以进行长度、分片、替换等操作,如下:

      用下标读取某个元素的值

      arr_element2=${arr_name[2]},即形式:${数组名[下标]}

      用#获取数组长度:${#数组名[@]} 或${#数组名[*]} 

      arr_len=${#arr_name[*]}或${#arr_name[@]}

           用#获取某元素值的长度

      arr_elem_len=${#arr_name[index]}   #index为数组下标索引

      删除数组

        删除数组某个元素:unset arr_name[index]

        删除整个数组:unset arr_number

      数组分片访问

        分片访问形式为:${数组名[@或*]:开始下标:偏移长度}

        例如:

            arr_name=(1 2 3 test go now)

               echo ${arr_name[@]:1:2},将输出2 3

        ${arr_name[@]:1:2},这里分片访问从下标1开始,元素个数为2。

      有用的数组扩展

        数组支持”+=“赋值运算符,利用这一点可以通过这种方式往一个已知数组中更方便的添加元素,特别是往空数组中填充元素时非常有用

        例如:

            

        实际应用举例:

          为了充分利用多核处理器,对一组文件进行md5散列计算时,将每个文件的md5计算放到后台,

          利用空数组把每次调用md5sum命令产生的后台进程ID收集到空数组中,并等待所有后台md5sum进程结束后才退出主进程

          下面是gen_checksum.sh脚本的内容:

          #!/bin/bash

          #文件名:gen_checksum.sh

          PIDARRAY=()

          for file in file{1..10}iso ; do

             md5sum $file & 

             PIDARRAY+=($!)

          done

          wait ${PIDARRAY[@]}

         另一种方法扩展数组

          利用shell只有一维数组,在赋值时引用多个数组进行合并

         例如:

            格式:merge_array=( ${a[@] ${b[@]} ... )

            

      模式替换

        格式为:${数组名[@或*]/模式/新值}

        例如:echo ${arr_name[@]/now/past},将输出1 2 3 test go past

      数组的遍历

        通常我们使用for命令遍历数组,遍历数组时对数组引用通常需要加上双引号,这样才能正确遍历含有空格字符串的元素

        例如:定义了数组arr_name=(1 2 3 test go now "a whole sentence"),遍历时 输出如下:

                             

         如果使用${arr_name[*]}格式引用数组进行遍历,将得到一个数组元素以空格分隔的字符串

                            

       

       为什么遍历数组时要加双引号?

        无论使用@还是*的格式引用数组,不存在含空格的元素时,加不加引号对数组遍历不会有什么问题,

      但一旦元素中含有空格,将不能得到预期效果,在实际使用时,元素的值通常时变量替换得到的,这不能保证

      是否含有空格,因此,为了稳妥起见,建议用引号括住数组变量,下面时不加引号的表现:

        例如:最后一个元素的值是a whole sentence字符串,包含有空格,但遍历后以空格被拆分了,显然这不是我们想要的结果

                            

                            

  • 相关阅读:
    cinder支持nfs快照
    浏览器输入URL到返回页面的全过程
    按需制作最小的本地yum源
    创建可执行bin安装文件
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    惠普IPMI登陆不上
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)原理,架构与基本流程
    flask上下文流程图
  • 原文地址:https://www.cnblogs.com/dingbj/p/10090583.html
Copyright © 2011-2022 走看看