Shell 数组变量

普通数组:只能使用整数作为数组索引

关联数组:可以使用字符串作为数组索引

普通数组

定义数组

方法1: 一次赋一个值

  1. 数组名[索引]=变量值

示例

  1. # array1[0]=pear
  2. # array1[1]=apple
  3. # array1[2]=orange
  4. # array1[3]=peach

方法2: 一次赋多个值

  1. 数组名=(变量值1 变量值2 变量值3 ...)

示例

  1. # books=(linux shell awk openstack docker)
  2. --------------------------------------------
  3. | linux | shell | awk | openstack | docker |
  4. --------------------------------------------
  5. | 0 | 1 | 2 | 3 | 4 | 索引(下标)
  6. --------------------------------------------
  7. # array2=(tom jack alice)
  8. # array3=(`cat /etc/passwd`) 希望是将该文件中的每一个行作为一个元数赋值给数组 array3(由于分隔符的原因,最终可能无法满足预期)
  9. # array4=(`ls /var/ftp/Shell/for*`)
  10. # array5=(tom jack alice "bash shell")
  11. # colors=($red $blue $green $recolor)
  12. # array5=(1 2 3 4 5 6 7 "linux shell" [20]=saltstack)

访问数组元数

访问数组中的某个元数

  1. ${数组名[索引]}

示例

  1. # 定义普通数组
  2. [root@hadoop04 ~]# books=(linux shell awk openstack docker)
  3. # 访问普通数组
  4. [root@hadoop04 ~]# echo ${books[0]}
  5. linux
  6. [root@hadoop04 ~]# echo ${books[1]}
  7. shell
  8. [root@hadoop04 ~]# echo ${books[2]}
  9. awk
  10. [root@hadoop04 ~]# echo ${books[3]}
  11. openstack
  12. [root@hadoop04 ~]# echo ${books[4]}
  13. docker

访问数组中所有元数

  1. ${数组名[@]}
  2. # 等同于 ${数组名[*]}

示例

  1. [root@hadoop04 ~]# echo ${books[@]}
  2. linux shell awk openstack docker
  3. [root@hadoop04 ~]# echo ${books[*]}
  4. linux shell awk openstack docker

统计数组元数的个数 ☆☆☆

  1. ${#数组名[@]}

示例

  1. [root@hadoop04 ~]# echo ${#books[@]}
  2. 5

获取数组元数的索引 ☆☆☆☆☆

  1. ${!数组名[@]}

示例

  1. [root@hadoop04 ~]# echo ${!books[@]}
  2. 0 1 2 3 4

数组切片1

从索引 n 开始访问数组元数

  1. ${array1[@]:n}

示例

  1. [root@hadoop04 ~]# echo ${books[@]:3}
  2. openstack docker

数组切片2

从索引 n 开始访问,访问m个元数

  1. ${array1[@]:n:m}

示例

  1. [root@hadoop04 ~]# echo ${books[@]:2:2}
  2. awk openstack

遍历数组

  1. 通过数组元数的索引进行遍历

示例

  1. [root@hadoop04 shell_array]# vim array_hosts_while.sh
  2. #!/urs/bin/bash
  3. # 定义数组
  4. while read line
  5. do
  6. hosts[i++]=$line
  7. done < /etc/hosts
  8. echo "hosts first: ${hosts[0]}"
  9. echo
  10. # 遍历数组
  11. for i in ${!hosts[@]}
  12. do
  13. echo "hosts${i}: ${hosts[${i}]}"
  14. done
  15. [root@hadoop04 shell_array]# vim array_hosts_for.sh
  16. #!/usr/bin/bash
  17. # for array
  18. # 定义分隔符为回车
  19. OLD_IFS=${IFS}
  20. IFS=$'\n'
  21. # 定义数组
  22. for line in `cat /etc/hosts`
  23. do
  24. hosts[j++]=$line
  25. done
  26. # 遍历数组
  27. for i in ${!hosts[@]}
  28. do
  29. echo "hosts${i}: ${hosts[${i}]}"
  30. done
  31. IFS=${OLD_IFS}

关联数组

定义关联数组

声明关联数组变量

  1. declare -A 数组名

示例

  1. # declare -A ass_array1
  2. # declare -A ass_array2

方法1: 一次赋一个值

  1. 数组名[索引]=变量值

示例

  1. # 声明关联数组
  2. [root@hadoop04 shell_array]# declare -A ass_array1
  3. # 定义关联数组
  4. [root@hadoop04 shell_array]# ass_array1[index1]=pear
  5. [root@hadoop04 shell_array]# ass_array1[index2]=apple
  6. [root@hadoop04 shell_array]# ass_array1[index3]=orange
  7. [root@hadoop04 shell_array]# ass_array1[index4]=peach
  8. # 查看关联数组
  9. [root@hadoop04 shell_array]# declare -A | grep ass_array1
  10. declare -A ass_array1='([index4]="peach" [index1]="pear" [index2]="apple" [index3]="orange" )'

方法2: 一次赋多个值

  1. 数组名=([索引1]=变量值1 [索引2]=变量值2 [索引3]=变量值3 ...)

示例

  1. # 声明关联数组
  2. [root@hadoop04 ~]# declare -A person_info
  3. # 定义关联数组
  4. [root@hadoop04 ~]# person_info=([name]=ken [sex]=male [age]=27 [skill]=cloud)
  5. # 访问关联数组
  6. [root@hadoop04 ~]# echo ${person_info[age]}
  7. 27

访问数组元数

访问数组中的某个索引的元数

  1. ${数组名[索引]}

示例

  1. # 声明关联数组
  2. [root@hadoop04 ~]# declare -A person_info
  3. # 定义关联数组
  4. [root@hadoop04 ~]# person_info=([name]=ken [sex]=male [age]=27 [skill]=cloud)
  5. # 访问索引为age的元数
  6. [root@hadoop04 ~]# echo ${person_info[age]}
  7. 27

访问数组中所有元数

  1. ${数组名[@]}
  2. # 等同于 ${数组名[*]}

示例

  1. [root@hadoop04 ~]# echo ${person_info[@]}
  2. ken 27 cloud male
  3. [root@hadoop04 ~]# echo ${person_info[*]}
  4. ken 27 cloud male

统计数组元数的个数 ☆☆☆

  1. ${#数组名[@]}

示例

  1. [root@hadoop04 ~]# echo ${#person_info[@]}
  2. 4

获取数组元数的索引 ☆☆☆☆☆

  1. ${!数组名[@]}

示例

  1. [root@hadoop04 ~]# echo ${!person_info[@]}
  2. name age skill sex

遍历数组

  1. 通过数组元数的索引进行遍历

查看数组

查看所有普通数组

  1. declare -a

查看所有关联数组

  1. declare -A

练习

练习1:性别统计

☆☆☆ 把要统计的对象作为数组的索引

  1. [root@hadoop04 shell_array]# vim sex.txt
  2. jack m
  3. alice f
  4. tom m
  5. rose f
  6. robin m
  7. zhuzhu f
  8. [root@hadoop04 shell_array]# vim count_sex.sh
  9. #!/usr/bin/bash
  10. # count sex
  11. # v1.0 by ElegantSmile
  12. # 定义关联数组
  13. declare -A sex
  14. while read line
  15. do
  16. type=`echo ${line} | awk '{print $2}'`
  17. # 把要统计的对象作为数组的索引,通过自增实现统计
  18. let sex[${type}]++
  19. done < sex.txt
  20. for i in ${!sex[@]}
  21. do
  22. echo "sex $i: ${sex[$i]}"
  23. done
  24. [root@hadoop04 shell_array]# bash count_sex.sh
  25. sex f: 3
  26. sex m: 3

练习2:shell统计

使用关联数组统计文件 /etc/passwd 中用户使用的不同类型 shell 的数量

  1. [root@hadoop04 shell_array]# vim count_shells.sh
  2. #!/usr/bin/bash
  3. # count shells
  4. # v1.0 by ElegantSmile
  5. # 定义关联数组
  6. declare -A shells
  7. while read line
  8. do
  9. type=`echo ${line} | awk -F ':' '{print $NF}'`
  10. let shells[${type}]++
  11. done < /etc/passwd
  12. for i in ${!shells[@]}
  13. do
  14. echo "shell $i : ${shells[${i}]}"
  15. done
  16. # 执行脚本
  17. [root@hadoop04 shell_array]# bash count_shells.sh
  18. shell /sbin/nologin : 17
  19. shell /bin/sync : 1
  20. shell /bin/bash : 3
  21. shell /sbin/shutdown : 1
  22. shell /sbin/halt : 1

练习3:tcp连接状态统计

统计tcp不同连接状态的数量

  1. [root@hadoop04 shell_array]# vim count_tcpconn_status.sh
  2. #!/usr/bin/bash
  3. # count tcp status
  4. # v1.0 by ElegantSmile
  5. declare -A status
  6. # 注意centos6和centos7上ss -an的显示效果顺序不同
  7. type=`ss -an | grep :80 | awk '{print $2}'`
  8. for i in ${type}
  9. do
  10. let status[${i}]++
  11. done
  12. for i in ${!status[@]}
  13. do
  14. echo "status $i : ${status[${i}]}"
  15. done

07Shell数组的更多相关文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

  4. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  5. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

  6. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  7. js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的

    题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...

  8. javascript数组查重方法总结

    文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...

  9. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

随机推荐

  1. uva 11174 Stand in a Line (排列组合)

    UVa Online Judge 训练指南的题目. 题意是,给出n个人,以及一些关系,要求对这n个人构成一个排列,其中父亲必须排在儿子的前面.问一共有多少种方式. 做法是,对于每一个父节点,将它的儿子 ...

  2. 生成所有2^n个长度为n的比特串

    #include<stdio.h> void BitstringsRec(int n); int A[1000]; int G_N; int main(void) { while(1) { ...

  3. Lecture Collection

    Distributed ML Yibo Zhu 主要讲了如何分布式的进行机器学习,主要用到的思想是指令的流水调度的相关的思想. IoT Zhenjiang Li 普通的各种卡是基于PIN来进行身份验证 ...

  4. python实用工具包

    文本处理 FlashText     大规模关键字搜索利器,据说多余500个关键字时性能会明显优于正则表达式,暂未评测! 调试利器 pysnooper     不需要使用print进行调试

  5. CSS画矩形、圆、半圆、弧形、半圆、小三角、疑问框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. H3C 帧中继网络拓扑

  7. jQuery中动态创建、添加元素的方法总结

    <input type="button" value="创建元素" id="btn"> <div id="box ...

  8. P1044 最大值最小化

    题目描述 在印刷术发明之前,复制一本书是一个很困难的工作,工作量很大,而且需要大家的积极配合来抄写一本书,团队合作能力很重要.当时都是通过招募抄写员来进行书本的录入和复制工作的, 假设现在要抄写 \( ...

  9. Java 5,6,7,8,9,10,11新特性吐血总结

    作者:拔剑少年 简书地址:https://www.jianshu.com/u/dad4d9675892 博客地址:https://it18monkey.github.io 转载请注明出处 java5 ...

  10. idea启用列模式的方式小结

    (1)alt+鼠标左键----实现的是几个连续列要向上或者向下拉,能够同时操作多行数据. (2)Shift+alt+鼠标左键----可以实现点选跨行的列模式同时操作,而且不通行可以点选不通列,进行跨行 ...