设为首页 收藏本站
查看: 681|回复: 0

linux shell 动态生成 数组系列 seq使用技巧

[复制链接]

尚未签到

发表于 2015-4-29 10:38:30 | 显示全部楼层 |阅读模式
  如果对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'
#############################
  上面例子:通过加入间隔字符‘#’后,替换掉数字, 生成连续相同字符’#’,这个在以后书写中还是有不少帮助。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61849-1-1.html 上篇帖子: shell脚本报错说 bash解释器损坏,没有该目录或文件的解决方案 下篇帖子: Shell实现等待用户输入并设定缺省执行
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表