linux系统计算从1加到100之和思路

思路集锦:
1.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运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
2.使用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运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
3.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运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
4.(())的其它写法
[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
提示:以上两结果都是对的
-------------------------------------------------
5.使用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运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
6.使用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运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
7.使用数学公式直接计算※※※※※
[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等更有效率。
-------------------------------------------------
8.拼接字符串计算表达式后结合bc求和计算方法
[oldboy@student ~]$  cat chars.sh 
#!/bin/sh
chars=0
for ((i=1; $i<=100; i++ ));do
chars="$chars+$i"
done
echo $chars|bc 
-------------------------------------------------
9.使用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
-------------------------------------------------
10.{}数字列表结合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运维实战培训的课堂讲解或者评论交流。
-------------------------------------------------
11.{}数字列表结合awk方法
[oldboy@student ~]$ echo {1..100}|tr " " "\n"|awk '{total+=$1} END {print total}'
5050
-------------------------------------------------
12.{}数字列表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
-------------------------------------------------
13.seq结合bc较少字符计算方法(压轴了,最少字符实现方法)
[oldboy@student ~]$ seq -s + 100|bc
5050
[oldboy@student ~]$ seq -s "+" 100|bc
5050
老男孩提示:
1)注意seq命令-s分隔符参数的用法。
2)此法比法④强的不是一点半点。值得我们研究学习。
有关此法更详细的信息请见老男孩linux运维实战培训的课堂讲解或者评论交流。
本想⑩全⑩美就得,结果没打住!

你可能感兴趣的:(Shell)