Shell中的数组及其相关操作
http://blog.csdn.net/jerry_1126/article/details/52027539
Shell中数据类型不多,比如说字符串,数字类型,数组。数组是其中比较重要的一种,其重要应用场景,可以求数组长度,元素长度,遍历其元素,元素切片,替换,删除等操作,使用非常方便。
Shell中的数组不像JAVA/C,只能是一维数组,没有二维数组;数组元素大小无约束,也无需先定义数组的元素个数;但其索引则像JAVA/C/Python,从0开始,下面其常用的方式进行总结.
【数组声明】
备注:
1) 不像JAVA/C等强编程语言,在赋值前必须声明;SHELL只是弱编程语言,可事先声明也可不声明;
2) 用unset来撤销数组,可用unset array_name[i]来删除里面的元素
【数组定义】
备注:
1) 数组中的元素,必须以"空格"来隔开,这是其基本要求;
2) 定义数组其索引,可以不按顺序来定义,比如说:names=([0]=Jerry [1]=Alice [2]=David [8]=Wendy);
3)字符串是SHELL中最重要的数据类型,其也可通过($str)来转成数组,操作起来非常方便;
【数组长度】
备注:
1) 使用${array_name[@]} 或者 ${array_name[*]} 都可以全部显示数组中的元素
2) 同样道理${#array_name[@]} 或者 ${#array_name[*]}都可以用来求数组的长度
3)求数组中元素的长度方法有很多,相当于求字符串的长度
【数组遍历】
脚本输出:
备注:
1) 可以使用标准的for循环,这种类C语言的方式来遍历数组中的元素
2) for 元素 in 元素集(数组) 这种类Python的方式来遍历数组
3)从代码可读性与执行速度来看,推荐使用第二种方式
【数组赋值】
备注:
1) 第一种是给已经存在的元素项重新赋值
2) 当然也可以给不存在的索引添加赋值,可以看下面的示例
【数组添加】
【数组切片】
数组切片
元素切片
备注:
1) 通用的格式${array[@]:起始位置:长度},中间以":"隔开,如果第二项省略的话,就取后面所有的项
2) 切片后返回的是字符串,可以通过 新数组=(${旧数组[@]:索引:长度})来索引,参见上面最后一个例子
3) 区别于Python之一:起始位置可以为负数,但必须以放在()中,长度不能为负数
4)区别于Python之二:第二项在Python里面是结束索引,在Shell则代表所取元素的长度
5) 区别于Python之三:Python可以通过 list[-1:-4:-2]来反向取数,在Shell则实现不了
【数组替换】
${array[@]/x/y} 最小匹配替换,每个元素只替换一次
${array[@]//x/y} 最大匹配替换,每个元素可替换多次
${array[@]/x/} 最小匹配删除,只删除一个符合规定的元素
${array[@]//x/} 最大匹配删除,可删除多个符合规定的元素
${array[@]/#x/y} 从左往右匹配替换,只替换每个元素最左边的字符
${array[@]/%x/y} 从右往左匹配替换,只替换每个元素最右边的字符
【数组删除】
# 每个元素,从左向右进行最短匹配
## 每个元素,从左向右进行最长匹配
% 每个元素,从右向左进行最短匹配
%% 每个元素,从右向左进行最长匹配
【数组应用】
示例一: 将ifconfig命令取到的本地IP: 127.0.0.1逐行显示出来
脚本输出:
示例二: 模拟堆栈的push,pop,shift,unshift操作
脚本输出:
示例三: 在1-10间,随机生成10个不重复的数,将其放置于数组中
脚本输出:
备注:
1) 生成[1,10]范围内不重复的随机整数,并保存到数组array中
2) seq 1 10 用于生成1~10的整数序列(包含边界值1和10)
3) awk中的rand()函数用于随机产生一个0到1之间的小数值(保留小数点后6位)
4)rand()只生成一次随机数,要使用srand()函数使随机数滚动生成
5) 括号里留空即默认采用当前时间作为随机计数器的种子,这样以秒为间隔,随机数就能滚动随机生成了
6) 由于以秒为间隔,所以如果快速连续运行两次脚本(1s内),你会发现生成的随机数还是一样的
示例四: 将字符串处理后转为为数组,再对其打印输出
脚本输出:
示例五: 用read -a参数,从标准输入中读取数组,再做操作
脚本输出:
示例六: 判断某个变量,是否在数组中,在输出YES,否输出NO
脚本输出:
示例七: 对数组中的元素进行排序
示例八: 将/etc/passwd文件中以:分隔的第一列,即用户名放置于一个数组中
示例九: 将1-8,每个数自乘后输出
脚本输出:
示例十: 借助数组来设置SHELLS的环境变量
示例十一: 设置IFS,读取文件内容示例
示例十二: 利用eval,模拟实现数组的功能
脚本输出:
示例十三: 利用数组来实现冒泡排序
思路:会重复地走访过要排序的数组,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。越大的元素会经由交换慢慢“浮”到数列的顶端
脚本输出:
示例十四: 利用数组来求最大值
脚本输出
Shell中的数组及其相关操作的更多相关文章
- linux shell 中的数组的取值 遍历 替换 删除操作
引言 在Linux平台上工作,我们经常需要使用shell来编写一些有用.有意义的脚本程序.有时,会经常使用shell数组.那么,shell中的数组是怎么表现的呢,又是怎么定义的呢?接下来逐一的进行讲解 ...
- php对二维数组进行相关操作(排序、转换、去空白等)
php对二维数组进行相关操作(排序.转换.去空白等) 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-11-04 这篇文章主要介绍了php对二维数组进行相关操作,包括php对 ...
- shell中的函数、shell中的数组、告警系统需求分析
7月16日任务 20.16/20.17 shell中的函数20.18 shell中的数组20.19 告警系统需求分析 20.16/20.17 shell中的函数 函数就是一个子shell就是一个代码段 ...
- Javascript Jquery 中的数组定义与操作_子木玲_新浪博客
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- grails项目中(DB的相关操作)
grails项目中(DB的相关操作) save:保存Domain对象的数据到对应的库表中(可能是insert也可能是update) findBy: 动态方法,查找并返回第一条记录,方法名可以变化 eg ...
- Linux centosVMware shell中的函数、shell中的数组、
一.shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function _name() { command ...
- Linux小知识(1): bash中执行数据库的相关操作
工作中经常会遇到命令行操作数据库或登陆至其他服务器等情况,往往需要通过命令行进入相关的数据库或登陆至相关的服务器,再执行指令操作,因此有没有方法,在命令行或bash脚本中模拟进入数据库或登陆服务器操作 ...
- 九 Shell中的数组
数组:用一个变量存储一组数据,并能够对这组数据中的某一个数据单独操作. 数组的类型:一维数组.二维数组.多维数组 变量的类型 Shell中默认无类型 变量的值默认均视为文本 用在数字运算中时,自动将其 ...
- C++中有关数组的相关问题
1.数组长度相关: strlen(from <string.h>)只是针对字符数组才有的,他不包含\0的长度.无法对其他类型求长度.sizeof()则可以对\0发起作用.记住(a.leng ...
随机推荐
- C# 字符串按 ASCII码 排序,注意其中的小坑
https://www.cnblogs.com/similar/p/6739293.html 在和银行做数据对接时,涉及到数据传输时的验签及加密.其中数据签名方案中就要求数据项根据属性名按 ASCII ...
- tcp那个孤独的小包到底怎么回事?
内核3.10,接<tcp的发送端一个小包就能打破对端的delay_ack么?> 我们继续来分析这个没满mss的小包, 可以看到,由于受到syn ack这端是发包端,所以该发送链路协商的ms ...
- PowerDesigner工具将表字段转成java实体
首先将数据库的表导出为SQL文件.下载安装PowerDesigner工具. 下面以图文的形式讲解: 图 (1) 图 (2) 图 (3) 图 (4) 图 (5) 图 (6) 图 ...
- Linux 操作命令
1. Linux 概述1.1. 内核版本 从技术角度来讲, Linux只是一个系统内核,一个内核并不是一套完整的操作系统.一套完整的操作系统应该包括内核. GNU应用程序库和工具.图形桌面环境等 ...
- 使用python备份文件
想写个定时备份文件的功能,这个功能需要实现:1.搜索指定的目录里是否存在当天的文件2.如果存在压缩并加密文件3.通过ftp上传到备份服务器4.在备份服务器上定时将文件拷贝到移动硬盘并定时清理文件 本来 ...
- 转载:C# socket端口复用-多主机头绑定
什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口复用 ...
- Maven下Spring + SpringMvc + Hibernate4 配置实例
1. 开发环境 IDEA 2. 在pom.xml中配置引用相关的包. <properties> <junit.version>4.10</junit.version> ...
- 关于activity的一点总结(一)
关于activity的重点: 参考网址:https://blog.csdn.net/qq_26787115/article/details/52556842 一.activity生命周期. 二..启动 ...
- 云笔记项目-Spring事务学习-传播SUPPORTS
接下来测试事务传播属性SUPPORTS Service层 Service层将方法的事务传播属性设置为SUPPORTS LayerT层代码 package LayerT; import javax.an ...
- 吐血Eclipse Maven Selenium TestNG的各种坑
刚入坑不久,有些是自己知识储备不够造成的,有些...那就是坑 在eclipse里面新建maven项目,然后添加testgn依赖,不多说,这个简单. 第一个坑: 然后在src/test/java这个文件 ...