热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linuxbashshell脚本的数学运算符(()),let,expr的效率比较

原文:linux系统计算从1加到100之和思路风暴博文前言:   本博文为《老男孩linux就业培训中心-初级班第七期课前考试及课
原文:linux系统计算从1加到100之和思路风暴

博文前言:
    本博文为《老男孩linux就业培训中心-初级班第七期课前考试及课上讲解的课后答案整理,
原题:通过shell编程或命令行方式求1+2+3...+100=?的和来活学活用shell及linux命令。
    阅读完本博文,你将熟悉shell编程中的for语句、while语句及until等语句的使用语法和应用方法。在linux的计算方面,您将熟悉(())、let、expr、bc等计算命令的使用语法和应用技巧。最后,您还将熟悉seq、tr、awk、sed、{1..100}等linux中的重要命令的使用技巧!

特别提醒:
    本博文的写作不在于用了多少种实现方法,而是抛砖引玉的给朋友们带来一个可供参考的学习思路和方法,这也是老男孩在linux运维实战培训课堂中讲课时一直所追求的。一个优秀的老师一定要有方法把自己的知识技能真正的输入到学生的脑袋里,这除了老男孩和学生经常说的学好运维的四要素:目标、方法、努力、坚持。还离不开一个优秀老师对学生思路的启发开导以及通过特殊的趣味性课堂教学培养学生主动思考问题的能力。当然,也要培养学生举一反三,的能力,让学生们在积极主动的思考中,不知不觉的,学到了该学习到的运维技术,从而养成良好的学习思考习惯。
    老男孩发现,技术学不好的学生,其实不是智商问题,主要是思路、思维、方法问题。而提升学生的思维、思路、意识、思想也是老男孩linux实战培训的核心内容。    
老男孩linux培训的宗旨:培养有限的学生成为企业的技术精英!
这就是老男孩坚持不屑一直追求的目标!
废话说完了,开始正题!

思路集锦:
①.C语言型for循环结构及(())计算式shell脚本

[oldboy@student ~]$  cat for1.sh
#!/bin/sh
j=0
for((i=0; i<=100; i++))
do
    ((j=j+i))
done
echo $j

写成一行的命令行写法:
for((i=0; i<=100; i++));do ((j=j+i));done;echo $j

老男孩提示:
1)此法中我们主要目的是学习expr命令的用法。
2)expr的效率低于(()),计算1加到100就有明显感觉。

有关此法更详细的信息请见老男孩linux运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
③.使用seq命令加for循环语法及let命令计算式脚本
[oldboy@student ~]$  cat for3.sh
#!/bin/bash
sum=0
i=1
for i in `seq 100`
do
   let sum=sum+i
done
echo $sum
老男孩提示:
1)这里我们需要学习seq命令结合for循环的用法。
2)let命令的计算语法。

提示:seq命令的语法:
1.生成序列[1…LAST]
seq LAST
例:seq 5 表示序列为 1 2 3 4 5
[oldboy@student ~]$  seq 5
1
2
3
4
5
2. 生成序列[FIRST…LAST],步长为1
seq FIRST LAST
例:seq 2 5表示序列为  2 3 4 5
[oldboy@student ~]$  seq 2 5
2
3
4
5
3.生成序列[FIRST…LAST],步长为INCREMENT
seq FIRST INCREMENT LAST
例:seq 2 2 5表示序列为  2 4
[oldboy@student ~]$  seq 2 2 5
2
4
提示:本例主要使用的是seq及let的用法,有关此法更详细的信息请见老男孩linux运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
④.seq、tr、sed、bc联手完成计算的方法
[oldboy@student ~]$  seq 100 | tr '\n' '+'|sed 's#\+$#\n#g'|bc
5050
老男孩提示:
1)注意bc命令的计算用法。
2)注意seq、tr、sed 3个命令的用法。
3) 命令解释说明:
1.seq 100         ==>竖排打印1...100个数字。
2.tr '\n' '+'     ==>把1...100个数字的结尾换行标签全部换成加号,即得1+2+3...+100+。
3.sed 's#\+$#\n#g'==>拼接的字符串表达式结尾加号替换为换行(回车)符。
4.bc    ==>交给bc计算
有关此法更详细的信息请见老男孩linux运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
⑤.(())的其它写法
[oldboy@student ~]$  cat for4.sh
#!/bin/bash
sum=0
for((i=1;i<=100;i++))
do
        sum=$((i+sum))
done
echo $sum
[oldboy@student ~]$  cat for5.sh
sum=0
for((i=1;i<=100;i++))
do
        sum=$((i+$sum))
done
echo $sum
提示:以上两结果都是对的
-------------------------------------------------
⑥.使用until语句及(())计算
[oldboy@student ~]$  cat until-1.sh
#!/bin/sh
i=1
until ((i >100 ))
do
  ((j=j+i))
  ((i++))
done
echo $j

老男孩提示:
1)这里我们主要学习until条件句的用法。
2)注意until和while语句的区别。until语句至少执行一次循环即使条件不成立。
3)循环里的计算式可以使用expr,let等替代之。

有关此法更详细的信息请见老男孩linux运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
⑦.使用while循环语句计算
[oldboy@A ~]$ cat while-1.sh
#!/bin/sh
i=1
while ((i <=100 ))
do
 ((j=j+i))
 ((i++))
done
echo $j
--------------
[oldboy@student ~]$  cat while-3.sh
#!/bin/sh
i=1
while [ $i -le 100 ] #same as while [[ $i -le 100 ]] or while [[ $i -le 100 ]]
do
  let j=j+i
  i=`expr $i + 1`    #same as ((i++)) or  let i=i+1
done
echo $j
老男孩提示:
1)学习while条件句的用法。
2)注意while ((i <=100 ))写法及while [ $i -le 100 ]和while [[ $i -le 100 ]]不同替代语法。
3)注意:i=`expr $i + 1`及((i++))和let i=i+1的几种实现语法。

有关此法更详细的信息请见老男孩linux运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
⑧.使用数学公式直接计算※※※※※
[oldboy@student ~]$  cat gongshi.sh
#!/bin/sh
i=100
echo $((i*(i+1)/2))
---------
[oldboy@student ~]$  cat gongshi-2.sh
#!/bin/sh
i=100
((sum=i*(i+1)/2))
echo $sum
---------
[oldboy@student ~]$  echo $((100*(100+1)/2))
5050

老男孩提示:
1)学习公式算法,代码简单而且运算高效。
   注意:上述公式中an表示等差数列的第n项。
    高中数学求和公式 :
    Sn=n(a1+an)/2
    Sn=a1n+n(n-1)d/2 d=公差
2)对于计算1+2+3...100用前面的方法计算,大家可能感觉不到多大差别,
但是如果计算1+2+3...10000000的话,前面的除了公司计算的所有方法可能就吃不消了。
无论是运维还是开发人员都要注意,尽量使用公式或算法计算。

有关此法更详细的信息请见老男孩linux运维实战培训的课堂讲解或者评论交流。
3)在计算时,(())计算式比let,expr等更有效率。
-------------------------------------------------
⑨.拼接字符串计算表达式后结合bc求和计算方法
[oldboy@student ~]$  cat chars.sh
#!/bin/sh
chars=0
for ((i=1; $i<=100; i++ ));do
chars="$chars+$i"
done
echo $chars|bc
-------------------------------------------------
⑩.使用seq和awk实现
[oldboy@student ~]$  seq 100 |awk '{total+=$1} END {print total}'
5050
[oldboy@student ~]$  seq 100 |awk '{total=total+$1} END {print total}'
5050
-------------------------------------------------
①①.{}数字列表结合tr、bc方法
[oldboy@student ~]$  echo {1..100}|tr " " "+"|bc
5050
老男孩提示:
1){ }序列的用法
[oldboy@student ~]$  echo {1..10}
1 2 3 4 5 6 7 8 9 10
[oldboy@student ~]$  echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
提示:上面用法的还有更出色的表现。
有关此法更详细的信息请见老男孩linux运维实战培训的课堂讲解或者评论交流。

2)seq默认情况只能是竖立排序列(以\n为分隔符号)
[oldboy@student ~]$  seq 3
1
2
3
加个-s分隔符参数看看:
[oldboy@student ~]$  seq -s " " 3
1 2 3
提示:seq仅支持打印数字序列,不支持字符等。

有关此法更详细的信息请见老男孩linux运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
①②.{}数字列表结合awk方法
[oldboy@student ~]$ echo {1..100}|tr " " "\n"|awk '{total+=$1} END {print total}'
5050
-------------------------------------------------
①③.{}数字列表for循环及计算命令方法
[root@student scripts]# cat for6.sh
#!/bin/sh
sum=0
for num in `echo {1..100}`
do
    sum=`expr $sum + $num`
done
echo $sum
-------------------------------------------------
①⑤.seq结合bc较少字符计算方法(压轴了,最少字符实现方法)
[oldboy@student ~]$ seq -s + 100|bc
5050
[oldboy@student ~]$ seq -s "+" 100|bc
5050
老男孩提示:
1)注意seq命令-s分隔符参数的用法。
2)此法比法④强的不是一点半点。值得我们研究学习。
有关此法更详细的信息请见老男孩linux运维实战培训的课堂讲解或者评论交流。
本想⑩全⑩美就得,结果没打住!
==老男孩个人介绍:

    老男孩,资深Linux系统运维网站架构专家、高级运维总监。从事一线网站运维及系统架构管理近12年,曾就职于若干个大规模高并发访问量的行业门户网站,并为多家互联网公司做过技术顾问,擅长大规模网站系统架构解决方案。于2007年开办了国内首个linux运维实战培训私塾式精英教育机构。并将个人的网站运维架构及教育领域的经验成功应用到IT教育领域教学工作。累计受益学生千余人(其中面授学生达200余人,部分学生就职于淘宝、阿里巴巴、百度、开心网、激动网、小米科技、土豆、酷六、sohusina、金山、尚德,chinacache,快网、遨游、赶集、拉手网,窝窝团、就业工场、联通、电信等众多国内知名公司)。

老男孩目前从事的工作:

1) 老男孩linux运维实战培训机构精英办学。

2)提供企业技术培训及技术顾问服务。

3)提供各种网站系统架构(数据库)解决方案。

4)提供linux技术方向企业雇员双向猎头、HR服务

5)提供优质linux运维原创系列视频。

6linux运维及开发类图书写作。

老男孩的联系方式:

名字:老男孩

QQ:31333741 

信箱:31333741@qq.com

个人博客:

http://oldboy.blog.51cto.com(运维技术分享地)

个人微博:

http://t.qq.com/tt31333741(运维思想分享地)

http://weibo.com/oldboy8

网站运维交流群: 114580181 45039636 37081784
======================================================
老男孩linux运维实战培训咨询方式
咨询:QQ:357851641 31333741 70271111
电话:18911718229
网站地址:http://www.etiantian.org  http://oldboy.cc
blog:http://oldboy.blog.51cto.com
======================================================

(全文完)


推荐阅读
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本文详细介绍了 MySQL 数据库中的基础操作,包括创建、查询、修改和删除数据库、表及数据的命令。通过具体的 SQL 语句示例,帮助读者快速掌握 MySQL 的基本操作。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 本文介绍如何在SQL Server中创建动态SQL存储过程,并提供详细的代码实例和解释。通过这种方式,可以更灵活地处理查询条件和参数。 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文由杨勇和思远于2012年12月27日撰写,主要探讨了如何使用PHP进行网页内容抓取,特别是针对字符较多的网站。文章详细介绍了正则表达式失效的原因,并提供了优化方法,同时展示了如何抓取淘宝服饰栏、天气信息以及IP地址对应的地理位置。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 随着Redis功能的不断增强和稳定性提升,其应用范围日益广泛,成为软件开发人员不可或缺的技能之一。本文将深入探讨Redis集群的部署与优化,包括主从备份机制、哨兵模式以及集群功能,帮助读者全面理解并掌握Redis集群的应用。 ... [详细]
  • 如何使用PyCharm及常用配置详解
    对于一枚pycharm工具的使用新手,正确了解这门工具的配置及其使用,在使用过程中遇到的很多问题也可以迎刃而解,文中有非常详细的介绍, ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 在网站制作中随时可用的10个 HTML5 代码片段
    HTML很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单。在这篇文章中,我收集了10个超有用的HTML代码片段,有HTML5启动模板、空白图片、打电话和发短信、自动完 ... [详细]
  • 问题描述:通过添加最少数量的括号,使得给定的括号序列变为合法,并输出最终的合法序列。数据范围:字符串长度不超过100。涉及算法:区间动态规划(Interval DP)。 ... [详细]
author-avatar
用户19910071
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有