linux的shell的编程方面很强大,最近在写脚本的时候,需要用到shell的数组。下面对最近的学习和使用做个简单的总结。

定义

linux的数组分两种,一种是普通的下标数组,一种是关联数组。前者和其他语言的数据一样通过下标进行访问。关联数组,可以通过key来获取值,key可以是数字或字符串。两者比较像高级语言Java里面的array和map。

关联数组

关联数据可以使用declare -A 声明。

shuanghu@shuanghu:tmp$ cat array.sh
declare -A arr;
arr["a"]=b;
echo ${arr["a"]};
shuanghu@shuanghu:tmp$ ./array.sh
b

普通数组

普通数组,可以通过declare -a声明。

shuanghu@shuanghu:tmp$ cat ./array2.sh
declare -a arr;
arr[0]=b;
echo ${arr[0]};
shuanghu@shuanghu:tmp$ ./array2.sh
b

赋值与引用

定义完数组之后,当然就是使用了,shell里数组都是通过下标进行赋值和引用。赋值语法:数组名[下标]=字符串 。在赋值的时候,等号左右是不能有空格的,shell是空格敏感的, 下标和字符串,引号不是必须的

引用数组元素,则使用${数组名[下标]}

关联数组

关联数组的下标,可以使字符串,也可以是数字。如果下标存在,则会覆盖之前的值,如果下标不存在,则会添加新的下标。在引用的时候,如果下标不存在,不会报任何错误,只会返回空字符串。

shuanghu@shuanghu:tmp$ cat ./map_arr.sh
declare -A arr;
echo ${arr[ab]}
arr[ab]="letter_a"
echo ${arr[ab]}
arr[ab]="letter_b"
echo ${arr[ab]}
shuanghu@shuanghu:tmp$ ./map_arr.sh letter_a
letter_b

普通数组

普通数组的赋值和引用,也是通过下标进行的,但普通数组只能使用数组作为下标,如果使用非数字,则默认为0。普通数组,不一定需要从0开始赋值。

shuanghu@shuanghu:tmp$ cat index_arr.sh
declare -a arr;
echo ${arr[0]}
arr[1]="one"
echo ${arr[1]}
arr[aa]="zero"
echo ${arr[0]}
shuanghu@shuanghu:tmp$ ./index_arr.sh one
zero

获取全部key

可以一次性输出数组的所有值;通过:数组名[∗]或{数组名[*]} 或 {数组名[@]}

shuanghu@shuanghu:tmp$ cat index_arr.sh
declare -a arr;
echo "all element:"${arr[*]}
arr[1]="one"
echo "all element:"${arr[*]}
arr[aa]="zero"
echo "all element:"${arr[*]}
arr[1]="one_1"
echo "all element:"${arr[@]}
shuanghu@shuanghu:tmp$ ./index_arr.sh
all element:
all element:one
all element:zero one
all element:zero one_1

获取长度

获取数组长度,和获取数组全部值相比,多个#号。
通过:${#数组名[*]} 或 ${#数组名[@]} 可以得到数组的长度。
shell中,也可以获取数组元素的长度;通过:echo ${#数组名[下标]}

shuanghu@shuanghu:tmp$ cat index_arr.sh
declare -a arr;
echo ${#arr[*]}
arr[1]="one"
echo ${#arr[*]}
arr[aa]="zero"
echo ${#arr[*]}
arr[1]="one_1"
echo ${#arr[@]}declare -A arr2;
echo ${#arr2[@]}
arr2["a"]="aa"
echo "arr2 length:${#arr2[@]}"
echo "arr2[a] length:${#arr2[a]}"
shuanghu@shuanghu:tmp$ ./index_arr.sh
0
1
2
2
0
arr2 length:1
arr2[a] length:2

获取全部下标key

获取数组全部key,语法:
!数组名[∗]或{!数组名[*]} 或 {!数组名[@]}

shuanghu@shuanghu:tmp$ cat index_arr.sh
declare -a arr;
echo ${!arr[*]}
arr[1]="one"
echo ${!arr[*]}
arr[aa]="zero"
echo ${!arr[*]}declare -A arr2;
arr2[aa]="value"
echo ${!arr2[*]}
shuanghu@shuanghu:tmp$ ./index_arr.sh 1
0 1
aa

从上面的代码,可以看出,如果对普通数据使用非数字下标,则相对于对于下标0进行操作。

括号操作()

在linux bash中,有个特殊的变量,叫IFS(Internal Field Separator),当shell需要对字符串进行分割时,则使用IFS值作为分割符。该字段的默认值为空格,回车和tab符。shell中将字符串放在括号内,则会将字符串分割成数组。

shuanghu@shuanghu:tmp$ cat index_arr.sh
arr=(aa bb cc)
echo "key:"${!arr[*]}
echo "val:"${arr[*]}
shuanghu@shuanghu:tmp$ ./index_arr.sh
key:0 1 2
val:aa bb cc

IFS的值,也是可以改变,因为IFS是个全局变量。改变IFS值后,在使用结束后,最好将IFS值改回默认值,这样避免其他使用IFS默认值的脚本不会产生bug。下面是一种改变IFS值的方法。

OLD_IFS=$IFS
IFS=","
IFS=$OLD_IFS

遍历数据

  1. 普通数组遍历,得到长度,然后使用下标进行变量
shuanghu@shuanghu:tmp$ cat list_array.sh
declare -a arr=(a b c);
for (( i=0; i<${#arr[@]}; ++i));doecho ${arr[$i]};
done
shuanghu@shuanghu:tmp$ ./list_array.sh
a
b
c
  1. 使用for in方式进行变量
shuanghu@shuanghu:tmp$ cat list_array.sh
declare -a arr=(a b c);
for val in ${arr[*]};doecho ${val}
donedeclare -A arr2;
arr2["a"]=aa
arr2["b"]=bb
arr2["c"]=cc
for val in ${arr2[@]};doecho ${val};
done
shuanghu@shuanghu:tmp$ ./list_array.sh
a
b
c
aa
bb
cc

删除元素

使用unset关键字可以删除整个数组,或者数组内的某个元素。

shuanghu@shuanghu:tmp$ cat unset_array.sh
arr=(a b c)
echo ${!arr[*]},${arr[*]}
unset arr[1]
echo ${!arr[*]},${arr[*]}
unset arr
echo ${!arr[*]},${arr[*]}echo "-------------"declare -A arr2;
arr2["a"]=aa
arr2["b"]=bb
arr2["c"]=cc
echo ${!arr2[*]},${arr2[*]}
unset arr2[a]
echo ${!arr2[*]},${arr2[*]}
unset arr2
echo ${!arr2[*]},${arr2[*]}shuanghu@shuanghu:tmp$ ./unset_array.sh
0 1 2,a b c
0 2,a c
,
-------------
a b c,aa bb cc
b c,bb cc
,

切片操作

shell中的数组,支持切片操作。通过:${数组名[@或*]:起始位置:长度} 可以进行数组的切片操作;
切片操作返回一个以空格分隔的字符串,原数组数据不变。如果想把结果转成数组,则可以使用上面介绍的括号操作。

shuanghu@shuanghu:tmp$ cat index_arr_slice.sh
arr=(1 2 3 4 5)
echo ${arr[@]:0:3}
echo ${arr[@]:6:3}
echo ${arr[@]:1:7}
echo ${arr[@]:-1:7}
echo ${arr[@]:-1:2}echo "------"declare -a arr2;
arr2[1]=2
arr2[3]=4
echo ${arr2[@]:0:1}
echo ${arr2[@]:1:2}
echo ${arr2[@]:2:2}
echo ${arr2[@]:3:2}echo "-------"
new_arr=(${arr[@]:0:3})
echo ${new_arr[*]}
shuanghu@shuanghu:tmp$ ./index_arr_slice.sh
1 2 32 3 4 5
1 2 3 4 5
1 2 3 4 5
------
2
2 4
4
4
-------
1 2 3

从上面的测试程序输出结果,可以看出,shell的数组下标,不一定需要从0开始,但在进行切片的时候,shell数组会自动跳过那些不存在的下标。

替换操作

shell数组,支持替换操作,可以通过:${数组名[@]/待替换字符串/替换字符串} 进行数组替换操作。
将数组的所有值都输出,相当于一个字符串,对于数组的替换,其实和shell字符串的替换操作是一样的,具体可以参考
[ linux shell编程学习–字符串的使用和操作 ](
http://blog.csdn.net/shuanghujushi/article/details/51298672 )

shuanghu@shuanghu:tmp$ cat replace_arr.sh
declare -A arr2;
arr2["a"]=aa
arr2["b"]=bb
arr2["c"]=ccecho ${arr2[@] /a/d}
echo ${arr2[@] //b/e}
shuanghu@shuanghu:tmp$ ./replace_arr.sh
da bb cc
aa ee cc

linux shell编程学习——数组使用相关推荐

  1. 《Linux Shell编程学习笔记之一》

    <Linux Shell编程学习笔记之一> 前言 由于自己一直在Windows上面编程,用linux用的比较少,学习linux还是本科大二学的一点点知识.因此自己就准备花点时间来熟悉下li ...

  2. Linux Shell编程学习笔记(2)

    Linux Shell编程学习笔记(2015-7-12) 分类:linux shell Shell变量 一:关于Shell变量   Shell是一种弱类型的语言,变量存储的一切值都是字符串.Shell ...

  3. Linux shell编程学习

    Linux shell编程学习 shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令.这点与Windows的命令提示符类似,但Linux shell的功能更加强 ...

  4. Linux Shell 编程学习笔记(1)

    Linux Shell编程学习笔(2015-7-11) 一:Shell程序运行的三种方法 赋予程序文件可执行权限,直接运行   比如:chmod a+x shell.sh 使用命令解释器(即shell ...

  5. Linux Shell编程学习笔记(4)

    Linux Shell编程学习笔记(2015-7-20) 分类:linux shell   今天学习了Linux Shell中的控制结构.其实大多数语言的控制结构这一块都是基本类似的,有了C语言的基础 ...

  6. Linux Shell编程学习笔记(3)

    Linux Shell编程学习笔记(2015-7-19) 分类:linux shell 一:位置参数和特殊变量   什么是位置参数?   位置参数也叫位置变量,是运行shell脚本程序时,命令行she ...

  7. Linux Shell 编程学习总结

    Shell 教程 Shell简介:什么是Shell,Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成 ...

  8. Linux shell编程学习总结

    主要内容: shell编程 sed命令 awk命令 crontab定时器 什么是Shell? Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell Shell也 ...

  9. Linux Shell编程学习笔记一:shell简介

    Q:什么是Shell,什么是shell脚本? A:Shell是一种用C语言编写的程序,它是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作 ...

最新文章

  1. Yii2 使用 Joins 查询
  2. 成功解决 threading Exception unhandled RuntimeError
  3. android 判断网络是否可用
  4. 面试题目_数据分析SQL面试题目9套汇总
  5. [WPF]根据显示区域宽度裁剪字符串
  6. 数据挖掘标准流程规范
  7. 中标麒麟NeoKylin系统使用--使用UFEI安装中标麒麟系统过程中/dev/disk/by-label/NeoKylin does not exit问题的解决
  8. 各领域医疗机器人分析
  9. 如何下载OpenJDK安装版本
  10. 顺丰控股亏损:或时效件面临见顶危机,或下沉市场厮杀,或为220亿定增设局?
  11. 《自然》杂志:面对“电车难题”,不同国家的人有不同的道德选择
  12. 论文笔记1 | 使用CTC对湍流工业火焰进行瞬时三维重建
  13. 番茄花园版侵权被禁,用户怎么办?
  14. 代码行为异常容错机制与自我调节
  15. EXCEL添加一个目录并超链接到每张sheet
  16. 微信扫码提示在浏览器中打开的遮罩代码解决方式
  17. uniapp分包使用easycom自动按需加载
  18. 一款不错的java web网络相册管理系统
  19. html取代frame框架,替代iframe的最好方法 什么东西可以替代iframe
  20. Photoshop CC 2018 One-on-One: Mastery Photoshop CC 2018 One-on-One:精通 Lynda课程中文字幕

热门文章

  1. python 结构体排序(自定义排序规则)
  2. SpringBoot多redis集群配置
  3. 成都温江少年宫计算机培训班,温江建成13个乡村少年宫 农村孩子家门口开课
  4. 【eNSP 华为模拟器】单臂路由及操作步骤【图文】
  5. Java基本输入与输出
  6. 数据挖掘简介及模型介绍(二)
  7. 「造轮子」一个文件上传靶场知识总结记录
  8. (一) ES6 新特性 ——let与const关键字
  9. Java项目:JSP汉服服饰租赁展示商城项目
  10. 如何将照片导入进佳能相机中