bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


数组和变量的区别是:变量在内存中占用的空间是离散的,数组在内存中是先开辟一段连续的大内存空间,随后数组中的每个元素都放入数组内存中。数组元素使用数组index标识。

bash里有两种数组:普通数组和关联数组。普通数组只能使用整型数值作为数组索引,关联数组可以使用字符串作为索引。所谓的关联数组,它的另外三种称呼:字典(dict)、hash结构和映射(map),是一种key和value一 一对应的关系。

1.9.1 普通数组

定义数组的方式一:

  1. [root@xuexi tmp]# array_test=( )

它们分别存储在索引位0-3的位置上,是array_test[0]到array_test[3]对应的值。此时array_test[0]表示的是一个变量,所以使用$来引用。数组的引用方式:${array_name[index]}。

  1. [root@xuexi tmp]# echo ${array_test[]}

注意数组中定义是使用空格作为分隔符定义在括号内,而不是逗号。如果使用逗号,则它们将作为一个整体,也就是数组索引0的值。如果使用逗号,则:

  1. [root@xuexi tmp]# array_test=(,,,)
  2.  
  3. [root@xuexi tmp]# echo ${array_test[]} # 整体结果作为索引0位的值。
  4. ,,,

定义数组的方式二:可以自定义索引位。

  1. [root@xuexi tmp]# array_test1[]=
  2. [root@xuexi tmp]# array_test1[]=
  3. [root@xuexi tmp]# array_test1[]=
  4. [root@xuexi tmp]# array_test1[]=
  1. [root@xuexi tmp]# echo ${array_test1[*]}

但是在索引位4之后定义array_test1[7]=7则表示5和6的数组变量未定义,即不存在,这可以通过统计变量的元素个数来验证。但在shell中是可以直接引用未定义变量的,只不过它们的初始值是空或是0。

(1).打印数组所有值。

  1. [root@xuexi tmp]# echo ${array_test1[*]}

或者使用@符号。

  1. [root@xuexi tmp]# echo ${array_test1[@]}

(2).查看数组索引号。

  1. [root@xuexi tmp]# echo ${!array_test1[*]}
  2.  
  3. 或者
  4.  
  5. [root@xuexi tmp]# echo ${!array_test1[@]}

(3).数组中变量长度和数组长度。

  1. [root@xuexi tmp]# echo ${#array_test1[]} # 显示下标为1的数组变量的字符长度
  2.  
  3. [root@xuexi tmp]# echo ${#array_test1[*]} # 显示数组中的元素个数(只统计值不为空的元素)
  4.  
  5. [root@xuexi tmp]# echo ${#array_test1[@]} # 显示数组中的元素个数(只统计值不为空的元素)

1.9.2 关联数组

关联数组支持字符串作为数组索引。使用关联数组必须先使用declare -A声明它。

  1. [root@xuexi tmp]# declare -A array_dep # 声明之后就可以给其赋值了
  2.  
  3. [root@xuexi tmp]# array_dep=([name1]=longshuai [name2]=xiaofang)

其中name1和name2就是关联数组的index。引用数组变量时需要使用index来引用对应的值。

  1. [root@xuexi tmp]# echo ${array_dep[name1]}
  2. longshuai

也可以分开赋值。

  1. [root@xuexi tmp]# array_dep[name3]=zhangsan
  2.  
  3. [root@xuexi tmp]# array_dep[name4]=lisi
  4.  
  5. [root@xuexi tmp]# echo ${array_dep[name4]}
  6. lisi

(1).查看数组所有值。

  1. [root@xuexi tmp]# echo ${array_dep[*]}
  2. zhangsan xiaofang longshuai lisi # 可以看到是字母倒序排列的

或者:

  1. [root@xuexi tmp]# echo ${array_dep[@]}
  2. zhangsan xiaofang longshuai lisi

(2).查看数组索引号。

  1. [root@xuexi tmp]# echo ${!array_dep[@]} # 对应数组值的倒序排列
  2. name3 name2 name1 name4
  3.  
  4. 或者:
  5.  
  6. [root@xuexi tmp]# echo ${!array_dep[*]}
  7. name3 name2 name1 name4

(3).统计数组长度。

  1. [root@xuexi tmp]# echo ${#array_dep[*]}
  2.  
  3. 或者:
  4.  
  5. [root@xuexi tmp]# echo ${#array_dep[@]}

1.9.3 数组元素截取、替换

和变量的截取和替换是类似的。

  1. array=( )
  1. array0=${array[*]::} # 从数组全部元素中第2个元素向后截取2个元素出来(即3 )
  2. array1=${array[*]//} # 将数组中的5替换称6

还有从左匹配删除从右匹配删除,和变量是一样的。

  1. array=(one two three foue five)
  2.  
  3. array1=${array[*]#*o} # 从左非贪婪匹配并删除所有数组变量中匹配内容
  4. array2=${array[*]##*o} # 从左贪婪匹配并删除所有数组变量中匹配的内容
  5. array2=${array[*]%o} # 从右非贪婪匹配并删除所有数组变量中匹配内容
  6. array2=${array[*]%%o} # 从右贪婪匹配并删除所有数组变量中匹配内容

1.9.4 for循环遍历数组

在shell中的循环结构中,可以使用数组名来表示整个数组变量。

  1. for i in ${array[*]};do
  2. echo $i
  3. done

或者让i变成数组index的方法:

  1. for i in ${!array[*]};do
  2. echo ${array[$i]}
  3. done

以下是遍历数组的三个常见用法总结:

  1. array=($(ls /boot))
  2.  
  3. for i in ${array[*]};do # 以数组值的方式直接遍历数组
  4. echo $i
  5. done
  6.  
  7. for ((i=;i<${#array[*]};i++));do # 以数组变量个数的方式遍历数组
  8. echo ${array[$i]}
  9. done
  10.  
  11. for i in ${!array[*]};do # 以数组index的方式遍历数组
  12. echo ${array[$i]}
  13. done

以下是一个数组遍历的示例:统计文件中重复行的次数。假设a.log文件中内容如下。

  1. [root@xuexi ~]# cat a.log
  2. portmapper
  3. portmapper
  4. portmapper
  5. portmapper
  6. portmapper
  7. portmapper
  8. status
  9. status
  10. mountd
  11. mountd
  12. mountd
  13. mountd
  14. mountd
  15. mountd
  16. nfs
  17. nfs
  18. nfs_acl
  19. nfs
  20. nfs
  21. nfs_acl
  22. nlockmgr
  23. nlockmgr
  24. nlockmgr
  25. nlockmgr
  26. nlockmgr
  27. nlockmgr

以下是数组遍历的脚本。

  1. #!/bin/bash
  2.  
  3. declare -A array_test # 定义关联数组
  4. for i in `cat ~/a.log`
  5. do
  6. let ++array_test[$i]
  7. done
  8.  
  9. for j in ${!array_test[*]}
  10. do
  11. printf "%-15s %3s\n" $j :${array_test[$j]}
  12. done

该脚本中第一个for循环中,以文件中内容做数组的index,每遍历到一个index就对该index进行数学运算的自加1操作。这一过程是遍历文件内容并为数组变量赋值的过程。

这样就得到如下结果:

array_test[status]=2
array_test[nfs]=4
array_test[portmapper]=6
array_test[nlockmgr]=6
array_test[nfs_acl]=2
array_test[mountd]=6

第二个for循环是将array_test数组中所有数组变量及其值取出来,这一步是遍历数组的过程。所以得到最终的结果:

  1. [root@xuexi ~]# ./a.sh
  2. status :
  3. nfs :
  4. portmapper :
  5. nlockmgr :
  6. nfs_acl :
  7. mountd :

SHELL脚本--shell数组基础的更多相关文章

  1. 学习 shell脚本之前的基础知识

    转载自:http://www.92csz.com/study/linux/12.htm  学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写sh ...

  2. 转载:shell脚本之前的基础知识

    转载地址:http://www.92csz.com/study/linux/12.htm 第十二章 学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果 ...

  3. 大数据系列博客之 --- 深入简出 Shell 脚本语言(基础篇)

    首先声明,此系列shell系列博客分为四篇发布,分别是: 基础篇:https://www.cnblogs.com/lsy131479/p/9914747.html 提升篇:https://www.cn ...

  4. 学习shell脚本之前的基础知识

    日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目.有的单位 ...

  5. shell脚本之前的基础知识

    日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目.有的单位 ...

  6. shell脚本之编程基础介绍

    1.shell脚本简介 1.1 shell是什么? shell是一个命令解释器,它在操作系统的最外层负责直接与用户对话,把用户的输入解释给操作系统:并处理各种各样的操作系统的输入,将结果输出到屏幕返回 ...

  7. 第十二章 学习 shell脚本之前的基础知识

    http://www.92csz.com/study/linux/12.htm [什么是shell] 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.实际上,在shell和 ...

  8. 【shell脚本】 变量基础学习整理

    1.linux系统环境 echo 'echo /etc/profile ' >> /etc/profile echo 'echo /etc/bashrc' >> /etc/ba ...

  9. Shell脚本学习-数组

    跟着RUNOOB网站的教程学习的笔记 Shell数组 数组中可以存放多个值,Bash Shell只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与PHP类似). 与大部分编程语言类似,数 ...

随机推荐

  1. 计算机网络三:域名、IP地址和TCP/IP协议

    一.域名        域名(Domain Name),简称域名.网域,是由一串用点分隔的字符型标志名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时 ...

  2. 在windows上安装VTK

    看了很多教程,花了1天半的时间装上了,记录下. 前置条件:我安装了VS2015,用来编译工程. 参考资料 官方:http://www.vtk.org/Wiki/VTK/Building 安装:http ...

  3. 解决Eclipse中无法直接使用Base64Encoder的问题(转载)

    资源出处:https://blog.csdn.net/u011514810/article/details/72725398 Base64的加密解密都是使用sun.misc包下的BASE64Encod ...

  4. 安装virtualbox出现2503、2502的错误提示解决方法

    安装virtualbox右键选择以管理员的身份打开即可

  5. 只要一行代码求一串字符中某字符(串)出现次数,c#

    这里只要一行代码就行. static void Main(string[] args) { string str = "qwerwqr;sfdsfds;fdfdsf;dfsdfsdf;dsf ...

  6. vector作为二维数组

    vector本来就是可以用来代替一维数组的,vector提供了operator[]函数,可以像数组一样的操作,而且还有边界检查,动态改变大小. 这里只介绍用它来代替二维的数组,二维以上的可以依此类推. ...

  7. MyBatis在非Spring环境下第三方DataSource设置-Druid篇

    首先在ITEye上面看到一个同标题文章,在此说明,此文并非转载自 http://iintothewind.iteye.com/blog/2069522 ,因为这篇文章根本就是错误的,照着上面做,工程可 ...

  8. Xcode中SVN不能提交.a文件的解决方法

    我是搬运工!!!方便自己使用!!! 方案一: 在mac下很多svn管理工具默认都不能上传.a文件,这让人很苦恼.从网上扒了下,用命令行可以解决此问题. 打开终端,cd 进入到需要上传的.a文件所在的文 ...

  9. 《JavaScript 高级程序设计》读书笔记一 简介

    一   历史 二   实现 a. javascript三个部分: ECMAScript:由ECMA-262定义,提供核心语言功能: DOM:提供HTML的应用程序编程接口/提供访问和操作网页内容的方法 ...

  10. Nuget4.0 bug一粒

    这个锅到底是nuget的还是msbuild的我也不是很确定 在使用Nuget4.0打包编译项目时 当执行到nuget pack %%~dpna.csproj -build -Prop Configur ...