Shell 数组变量

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

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

普通数组

定义数组

方法1: 一次赋一个值

数组名[索引]=变量值

示例

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

方法2: 一次赋多个值

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

示例

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

访问数组元数

访问数组中的某个元数

${数组名[索引]}

示例

# 定义普通数组
[root@hadoop04 ~]# books=(linux shell awk openstack docker)
# 访问普通数组
[root@hadoop04 ~]# echo ${books[0]}
linux
[root@hadoop04 ~]# echo ${books[1]}
shell
[root@hadoop04 ~]# echo ${books[2]}
awk
[root@hadoop04 ~]# echo ${books[3]}
openstack
[root@hadoop04 ~]# echo ${books[4]}
docker

访问数组中所有元数

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

示例

[root@hadoop04 ~]# echo ${books[@]}
linux shell awk openstack docker
[root@hadoop04 ~]# echo ${books[*]}
linux shell awk openstack docker

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

${#数组名[@]}

示例

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

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

${!数组名[@]}

示例

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

数组切片1

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

${array1[@]:n}

示例

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

数组切片2

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

${array1[@]:n:m}

示例

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

遍历数组

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

示例

[root@hadoop04 shell_array]# vim array_hosts_while.sh 

#!/urs/bin/bash

# 定义数组
while read line
do
hosts[i++]=$line
done < /etc/hosts echo "hosts first: ${hosts[0]}"
echo # 遍历数组
for i in ${!hosts[@]}
do
echo "hosts${i}: ${hosts[${i}]}"
done [root@hadoop04 shell_array]# vim array_hosts_for.sh #!/usr/bin/bash
# for array # 定义分隔符为回车
OLD_IFS=${IFS}
IFS=$'\n' # 定义数组
for line in `cat /etc/hosts`
do
hosts[j++]=$line
done # 遍历数组
for i in ${!hosts[@]}
do
echo "hosts${i}: ${hosts[${i}]}"
done IFS=${OLD_IFS}

关联数组

定义关联数组

声明关联数组变量

declare -A 数组名

示例

# declare -A ass_array1
# declare -A ass_array2

方法1: 一次赋一个值

数组名[索引]=变量值

示例

# 声明关联数组
[root@hadoop04 shell_array]# declare -A ass_array1
# 定义关联数组
[root@hadoop04 shell_array]# ass_array1[index1]=pear
[root@hadoop04 shell_array]# ass_array1[index2]=apple
[root@hadoop04 shell_array]# ass_array1[index3]=orange
[root@hadoop04 shell_array]# ass_array1[index4]=peach
# 查看关联数组
[root@hadoop04 shell_array]# declare -A | grep ass_array1
declare -A ass_array1='([index4]="peach" [index1]="pear" [index2]="apple" [index3]="orange" )'

方法2: 一次赋多个值

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

示例

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

访问数组元数

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

${数组名[索引]}

示例

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

访问数组中所有元数

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

示例

[root@hadoop04 ~]# echo ${person_info[@]}
ken 27 cloud male
[root@hadoop04 ~]# echo ${person_info[*]}
ken 27 cloud male

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

${#数组名[@]}

示例

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

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

${!数组名[@]}

示例

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

遍历数组

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

查看数组

查看所有普通数组

declare -a

查看所有关联数组

declare -A

练习

练习1:性别统计

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

[root@hadoop04 shell_array]# vim sex.txt
jack m
alice f
tom m
rose f
robin m
zhuzhu f [root@hadoop04 shell_array]# vim count_sex.sh
#!/usr/bin/bash
# count sex
# v1.0 by ElegantSmile # 定义关联数组
declare -A sex while read line
do
type=`echo ${line} | awk '{print $2}'`
# 把要统计的对象作为数组的索引,通过自增实现统计
let sex[${type}]++
done < sex.txt for i in ${!sex[@]}
do
echo "sex $i: ${sex[$i]}"
done [root@hadoop04 shell_array]# bash count_sex.sh
sex f: 3
sex m: 3

练习2:shell统计

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

[root@hadoop04 shell_array]# vim count_shells.sh
#!/usr/bin/bash
# count shells
# v1.0 by ElegantSmile # 定义关联数组
declare -A shells while read line
do
type=`echo ${line} | awk -F ':' '{print $NF}'`
let shells[${type}]++
done < /etc/passwd for i in ${!shells[@]}
do
echo "shell $i : ${shells[${i}]}"
done # 执行脚本
[root@hadoop04 shell_array]# bash count_shells.sh
shell /sbin/nologin : 17
shell /bin/sync : 1
shell /bin/bash : 3
shell /sbin/shutdown : 1
shell /sbin/halt : 1

练习3:tcp连接状态统计

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

[root@hadoop04 shell_array]# vim count_tcpconn_status.sh
#!/usr/bin/bash
# count tcp status
# v1.0 by ElegantSmile declare -A status # 注意centos6和centos7上ss -an的显示效果顺序不同
type=`ss -an | grep :80 | awk '{print $2}'` for i in ${type}
do
let status[${i}]++
done for i in ${!status[@]}
do
echo "status $i : ${status[${i}]}"
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. AtCoder Beginner Contest 078 D ABS

    光做C了,做完C,就要结束了,看了看D,没看懂那操作啥意思,就扔了. 刚才看了看,突然懂了.. 就是每个人从那堆牌上边拿牌,最少拿一张,最多可以全拿走,然后手里留下最后一张拿到的,其余的都扔掉. 比如 ...

  2. oracle整合简单,无关联的数据库访问

    如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) 例如: SELECT NAME FROM EMP WHERE EMP_NO = 1234; SELECT NAM ...

  3. CODE FESTIVAL 2017 qual B D 101 to 010(dp)

    除非人品好,能碰巧想到思路,否则基本是做不出来dp的,除了那几个经典的dp模型.. 看了几个前几名的代码,还是t神的代码比较清晰.膜tourist 代码的思路和题解思路基本一致..... #inclu ...

  4. hdu 3635 Dragon Balls (MFSet)

    Problem - 3635 切切水题,并查集. 记录当前根树的结点个数,记录每个结点相对根结点的转移次数.1y~ 代码如下: #include <cstdio> #include < ...

  5. [C#] 用ServiceStack读写redis的性能问题

    ServiceStack.Redis有个方法叫 AddRangeToList,这个方法是有性能问题的.这个方法的实现代码如下: public void AddRangeToList(string li ...

  6. java el表达式报空指针异常(nullpointexception)

    最近在使用el表达式的时候,用到了int型变量,因为,很多时候,变量不会被赋初值,后面考虑了下,应该将声明由int 改为integer,改了之后就一直报空指针异常,后面仔细查看,我的getter和se ...

  7. H3C 帧中继基本配置命令(续)

  8. ios9.3.3 h5的js代码全部失效

    做微信公众号页面时,ios9.3.3 h5的js代码全部失效描述: 机型iphone6 plus,ios9.3.3js代码全部失效,刚开始还以为是ios和jq兼容问题, 后来发现是es6语法不能读,导 ...

  9. [转载] 学会使用Web Service上(服务器端访问)~~~

    http://www.360doc.com/content/10/0712/12/541242_38461863.shtml# 关于什么是Web Service,相信在很多地方都会有介绍.简单的讲,W ...

  10. Activiti - 新一代的开源 BPM 引擎

    http://www.ibm.com/developerworks/cn/Java/j-lo-activiti1/ ****************************************** ...