Shell动态生成数组的多种方法

如果对linux shell 数组不是很熟悉的话,请看上一篇文章:linux shell 数组建立及使用技巧  ,这篇文章主要讲是动态生成数组系列。方法应该很多,我这里主要以一个求和计算的题目为例进行分析。

题目:请用linux shell 写一段脚本,实现从1..1000中所有偶数的和值。

方法一:

通过while 循环得到需要的结果:

start=1;

total=0;

while [ $start -le 1000 ];do

  [[ $(($start%2)) == 0 ]]&&total=$(($total+$start));

  start=$(($start+1));

done;

echo $total;

[chengmo@centos5 ~]$ start=1;total=0;while [ $start -le 1000 ];do  [[ $(($start%2)) == 0 ]]&&total=$(($total+$start));  start=$(($start+1));done;echo $total;
250500

以上运行结果是:249500,在linux shell 中,”;”作为命令行分隔符。如果大家对于$(()) 运算符号不是很理解,可以查看:linux shell 实现 四则运算(整数及浮点) 简单方法  ,如果对于:[[]] [] 符号,可以参考另外一篇文章linux shell 逻辑运算符、逻辑表达式详解。

方法二:

通过 for 循环得到结果:

start=0;

total=0;

for i in $(seq $start 2 1000); do

  total=$(($total+$i));

done;

echo $total;

[chengmo@centos5 ~]$ start=0;total=0;for i in $(seq $start 2 1000); do  total=$(($total+$i));done;echo $total;
250500

上面语句已经代码方面明显优于方法一,而且性能方面表现也很好。下面比较就可以发现:

比较性能:

[chengmo@centos5 ~]$ time (start=0;total=0;for i in $(seq $start 2 1000); do  total=$(($total+$i));done;echo $total;)       250500

real  0m0.016s
user  0m0.012s
sys   0m0.003s
[chengmo@centos5 ~]$ time (start=1;total=0;while [ $start -le 1000 ];do  [[ $(($start%2)) == 0 ]]&&total=$(($total+$start));  start=$(($start+1));done;echo $total;)
250500

real  0m0.073s
user  0m0.069s
sys   0m0.004s

方法一耗时 是方法二的 6倍!

seq 使用:

seq [OPTION]... LAST
seq [OPTION]... FIRST LAST
seq [OPTION]... FIRST INCREMENT LAST

[chengmo@centos5 ~]$ seq 1000  ‘起始默认是 1,间隔默认也是1

[chengmo@centos5 ~]$seq 2 1000 ‘间隔默认是1

[chengmo@centos5 ~]$seq 1 3 10  '从1开始,到10 间隔为3 结果是:1 4 7 10

说明:默认间隔是“空格” 如果想换成其它的可以带参数:-s

[chengmo@centos5 ~]$seq -s'#' 1 3 10

1#4#7#10

应用技巧:

生成连续数组系列:

[chengmo@centos5 ~]$ a=($(seq 1 3 10))
[chengmo@centos5 ~]$ echo ${a[1]}
4
[chengmo@centos5 ~]$ echo ${a[@]}
1 4 7 10

生成连续相同字符:

[chengmo@centos5 ~]$ seq -s '#' 30 | sed -e 's/[0-9]*//g'
#############################

上面例子:通过加入间隔字符‘#'后,替换掉数字, 生成连续相同字符'#',这个在以后书写中还是有不少帮助。

(0)

相关推荐

  • Shell脚本函数定义和函数参数

    一.Shell函数 本教程目前为止所有脚本都是从头到尾执行.这样做很好,但你也许已经注意到有些脚本段间互相重复. shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数. shell中函数的定义格式如下: 复制代码 代码如下: 函数名(){     command1     command2     ...     commandN     [ return value ] } 如果愿意,可在函数名前加上关键字function,这取决于使用者. 复制代码 代码如下: funct

  • shell 使用数组作为函数参数的方法(详解)

    因工作需要,需要使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能传递到函数内. #!/bin/bash function showArr(){ arr=$1 for i in ${arr[*]}; do echo $i done } regions=("GZ" "SH" "BJ") showArr $regions exit 0 把代码保存为test.sh后执行,只输出了第一个元素. ./t

  • Shell动态生成数组的多种方法

    如果对linux shell 数组不是很熟悉的话,请看上一篇文章:linux shell 数组建立及使用技巧  ,这篇文章主要讲是动态生成数组系列.方法应该很多,我这里主要以一个求和计算的题目为例进行分析. 题目:请用linux shell 写一段脚本,实现从1..1000中所有偶数的和值. 方法一: 通过while 循环得到需要的结果: start=1; total=0; while [ $start -le 1000 ];do [[ $(($start%2)) == 0 ]]&&tot

  • jQuery操作动态生成的内容的方法

    本文实例讲述了jQuery操作动态生成的内容的方法.分享给大家供大家参考,具体如下: 由于jQuery是页面一加载获取页面元素的,后期动态生成的元素,通过$("#xxxx")获取不到,需要用原始的js语句来获取: document.getElementById("xxx").value 对于动态生成的元素,bind绑定的事件 也无法触发,需要通过jQuery提供的另外一个方法 .live() 这个方法是基本是的 .bind() 方法的一个变体.使用 .bind()

  • javascript动态生成树形菜单的方法

    本文实例讲述了javascript动态生成树形菜单的方法.分享给大家供大家参考,具体如下: //======================================== //Envrionment to hold Listeners //======================================== tv_listeners = new Array() ; function listener( type , handler ) { this.type = type ;

  • C#动态调整数组大小的方法

    本文实例讲述了C#动态调整数组大小的方法.分享给大家供大家参考.具体如下: 通常,我们创建一个数组后就不能调整其长度,但是Array类提供了一个静态方法CreateInstance用来创建一个动态数组,所以我们可以通过它来动态调整数组的长度. namespace ArrayManipulation { Class Program { static void Main (String[] args) { int[] arr = new int[]{1,2,3}; PrintArr(arr); ar

  • php动态生成版权所有信息的方法

    本文实例讲述了php动态生成版权所有信息的方法.分享给大家供大家参考.具体实现方法如下: function copyright($start, $owner) { $date = date('Y'); echo "© Copyright "; if ( $start < $date ) { echo "{$start} - "; } echo "{$date} {$owner}"; } 演示范例: 如果当前年份是2013, 使用 copyr

  • vue+element-ui动态生成多级表头的方法

    vue+element html配置: <div id="table">{{tableData}} <el-table :data="tabledata01" :span-method="tableSpanMethod" max-height="420"> <el-table-column v-for='item in tableConfig' :label="item.label&qu

  • vue侧边栏动态生成下级菜单的方法

    循环传入的数据去生成下级菜单 <template> <div class="headBar"> <div class="title"> 微商城管理后台 </div> <el-menu class="el-menu-headBar" mode="horizontal" @select="handleSelect" background-color=&quo

  • 使用React代码动态生成栅格布局的方法

    作为 TerminalMACS 的一个子进程模块 - React Web管理端,使用Ant Design Pro作为框架. 本文应用到的知识1.样式文件less中方法的使用2.for循环创建按钮和栅格布局(flex布局) 1. 最终效果及源码链接 作为前端新手的我,做下面这个简单功能花了好几天时间,问了不少前端大佬(大佬们应该要不到半个小时,惭愧惭愧),现在回想问的问题都很基础(有点丢人,哈哈),多谢了哦. 先看看效果 点击浏览源码:开源项目对应源码 2. 代码简单讲解 2.1 TypeScri

  • Java模板动态生成word文件的方法步骤

    最近项目中需要根据模板生成word文档,模板文件也是word文档.当时思考一下想用POI API来做,但是觉得用起来相对复杂.后来又找了一种方式,使用freemarker模板生成word文件,经过尝试觉得还是相对简单易行的. 使用freemarker模板生成word文档主要有这么几个步骤 1.创建word模板:因为我项目中用到的模板本身是word,所以我就直接编辑word文档转成freemarker(.ftl)格式的. 2.将改word文件另存为xml格式,注意使用另存为,不是直接修改扩展名.

  • JS生成随机数的多种方法汇总(不同范围、类型的随机数)

    目录 1,生成 [ 0, 1 ) 范围内的随机数(大于等于0,小于1) 2,生成 [ n, m ) 范围内的随机数(大于等于n,小于m) 3,生成 [n,m].(n,m).(n,m] 范围内的随机数 随机整数的生成 1,随机生成 0.1 这两个整数 2,生成 [ 0, n ) 范围内的随机整数(大于等于0,小于n) 3,生成 [ 1, n ] 范围内的随机整数(大于等于1,小于等于n) 4,生成 [ min, max ] 范围内的随机整数(大于等于min,小于等于max) 随机字符串的生成 1,

随机推荐