本文为原创博文,转发请注明原创链接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字符串,包含有空格,但遍历后以空格被拆分了,显然这不是我们想要的结果

bash shell数组使用总结的更多相关文章

  1. [Bash Shell] Shell学习笔记

    1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...

  2. Learning The Bash Shell读书笔记(整理)

    最近搞了一本书 Learning Bash Shell,发现有人已经写了阅读笔记,我就在这边整理一下 来自blog:http://blog.sina.com.cn/n4mine Learning Th ...

  3. Shell数组例子

    Shell数组例子 循环打印数组,并统计数组的个数: [root@slavedb array]# cat a.sh #!/bin/bash array=( freddy freddie tang sh ...

  4. shell脚本学习之Bash shell 里各种括号的用法

    今天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括 ...

  5. bash shell学习-实践 (自己实现一些小工具)

    The poor starve while the rich feast. "穷人饥肠辘辘,富人大吃大喝" 参考资料:鸟哥的Linux私房菜 基础学习篇(第三版)  Linux S ...

  6. bash shell学习-shell基础 (笔记)

    When you hoist the sails to cross the sea, you willride the wind and cleave the waves. "长风破浪会有时 ...

  7. 系统管理中 bash shell 脚本常用方法总结

    在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则 1. 单引号和双引号的区别 单引 ...

  8. (转)linux bash shell 入门教程

    Shell Script(bash)简介 众所皆知地,UNIX上以小工具著名,利用许多简单的小工具,来完成原本需要大量软体开发的工作,这一点特色,使得UNIX成为许多人心目中理想的系统平台. 在众多的 ...

  9. 教你使用shell数组

    数组的使用,需要掌握 1.对数组进行赋值 2.通过下标访问数组元素 3.循环遍历所有的元素 代码如下: #!/bin/bash a="39" b="5" c=& ...

随机推荐

  1. 自顶向下redis4.0(1)启动

    redis4.0的启动流程 目录 redis4.0的启动流程 简介 正文 全局server对象 初始化配置 初始化服务器 事件主循环 参考文献 简介 redis 在接收客户端连接之前,大概做了以下几件 ...

  2. 面试 02-CSS盒模型及BFC

    02-CSS盒模型及BFC #题目:谈一谈你对CSS盒模型的认识 专业的面试,一定会问 CSS 盒模型.对于这个题目,我们要回答一下几个方面: (1)基本概念:content.padding.marg ...

  3. react第十八单元(redux中间件redux-thunk,redux工程目录的样板代码,规范目录结构)

    第十八单元(redux中间件redux-thunk,redux工程目录的样板代码,规范目录结构) #课程目标 中间件:中间件增强redux的可扩展性,实现功能复用的目的. redux-thunk异步逻 ...

  4. [日常摸鱼]pojKaka's Matrix Travels-拆点+最大费最大流

    方格取数的升级版,每个格子最多取一次. $k=1$的话就是个普及组的dp题,$k=2$就是在之前的基础上多加两维. 然而现在$k$太大了当然就不dp啦 对于$k=1$的情况我们还可以把$(i,j)$向 ...

  5. Jmeter二次开发——基于Java请求

    简述 这近几年,越来越多非http的协议需要进行性能测试,包括不仅限于各类rpc.mq.缓存等.对于这些协议,市面上可能没有现成的工具可以直接使用,这个时候,我们可以自己动手,通过编写相应的JavaS ...

  6. 多任务-python实现-同步概念,互斥锁解决资源竞争(2.1.4)

    @ 目录 1.同步的概念 2.解决线程同时修改全局变量的方式 3.互斥锁 1.同步的概念 同步就是协同步调,按照预定的先后次序进行运行,如你说完我在说 同步在子面上容易理解为一起工作 其实不是,同指的 ...

  7. matplotlib的学习4-设置坐标轴

    import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3, 3, 50) y1 = 2*x + 1 y2 = x**2 ...

  8. AWVS批量导入网站(刷漏洞入门)

    今天整了一天这个AWVS批量扫描脚本,主要是下了好几个版本的AWVS,都不稳定,一次次删除又一次次安装. 做这件事儿目的就是为了批量刷漏洞,不过弄好之后又不打算刷漏洞了,不太喜欢无脑刷漏洞,没什么意义 ...

  9. Azure Terraform(二)语法详解

    一,引言 上篇文章开始,我们简单介绍了以下通过基础设施管理工具----- Terraform,通过它来统一管理复杂的云基础设施资源.作为入门演示,使用Terraform 部署Azure 资源组的方式直 ...

  10. 10天,从.Net转Java,并找到月薪2W的工作(二)

    辞去.Net工作之后,第一天直接去星巴克学习. 研究如何入门Java,对比学习资料以及安装Ieda. 由于正版太贵,Mac又不容易破解.鼓捣半天,最后结果是,我决定用教育账号申请一年的免费IDEA. ...