关闭

Shell中的数组及其相关操作

标签: Linux数组shell编程语言应用
11571人阅读 评论(1) 收藏 举报
分类:

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,模拟实现数组的功能


脚本输出:


示例十:  利用数组来实现冒泡排序

思路:会重复地走访过要排序的数组,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。越大的元素会经由交换慢慢“浮”到数列的顶端


脚本输出:


示例十:  利用数组来求最大值


脚本输出


2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

shell中的数组

shell中的数组shell作为一门语言那肯定是不能缺少数组了,下面记录了shell中数组的一些相关内容。 Bash 提供了一维数组变量。任何变量都可以作为一个数组;内建命令 declare ...
  • liuxingen
  • liuxingen
  • 2015-10-17 16:57
  • 7841

Shell脚本数组操作小结

Linux Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获...
  • imxiangzi
  • imxiangzi
  • 2015-12-21 15:28
  • 2450

@shell脚本中数组array常用技巧学习实践@

shell中数组的下标默认是从0开始的 1。将字符串放在数组中,获取其长度 #!/bin/bash str="a b --n d" array=($str) length=${#array[...
  • zhuying_linux
  • zhuying_linux
  • 2011-09-15 16:56
  • 27299

shell数组的定义及循环

shell中数组的定义及遍历,先直接看示例: #!/bin/sh #定义方法一 数组定义为空格分割 arrayWen=(a b c d e f) #定义方法二 arrayXue[0]="m" arr...
  • wenxuechaozhe
  • wenxuechaozhe
  • 2016-12-11 20:32
  • 10667

shell 数组长度

Shell 数组元素个数${#array[@]} 数组的所有元素${array[*]} 字符串长度${#str} 1、获取数组元素的个数:         array=(bill &#...
  • shaobingj126
  • shaobingj126
  • 2012-03-26 16:40
  • 36573

shell之数组

一 数组 1.1 定义数组 通过指定元素定义 array[key]=value key代表索引,如array[1]=one,索引从0开始 echo “${array[@]}”获取所有数组...
  • qq504196282
  • qq504196282
  • 2016-11-01 13:44
  • 1361

Shell数组:shell数组的定义、数组长度

Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元...
  • imxiangzi
  • imxiangzi
  • 2015-12-21 15:30
  • 1068

shell printf命令:格式化输出语句

printf 先来看一个简单的例子:使用命令printf “hello,world\n”, 输出:hello,world 再使用echo “hello,world\n”,输出为:he...
  • fanren224
  • fanren224
  • 2017-02-26 03:16
  • 1471

shell中的数组操作

1.数组定义:shell使用一对括号表示数组,数组元素间用”空格”分隔# 空数组arr1 arr1=() # 数组arr2,成员分别是1, 2, 3, 4, 5, 6 arr2=(1 2 3 4 5 ...
  • neven7
  • neven7
  • 2015-08-31 16:29
  • 5519

shell浅谈之十一别名、列表及数组

一、简介        lnuyx 二、详解 1、函数的定义 (1)函数是一串命令的集合,如果脚本中有重复代码时可以考虑使用函数,在shell中函数的返回值只能为退出状态0或1...
  • taiyang1987912
  • taiyang1987912
  • 2014-10-09 16:08
  • 12033
    个人资料
    • 访问:690971次
    • 积分:10795
    • 等级:
    • 排名:第1758名
    • 原创:329篇
    • 转载:81篇
    • 译文:11篇
    • 评论:69条