linuxbashshell腳本的數(shù)學(xué)運算符(()),let,expr的效率比較

原文:linux系統(tǒng)計算從1加到100之和思路風暴

博文前言:
    本博文為《老男孩linux就業(yè)培訓(xùn)中心-初級班第七期課前考試及課上講解的課后答案整理,
原題:通過shell編程或命令行方式求1+2+3...+100=?的和來活學(xué)活用shell及l(fā)inux命令。
    閱讀完本博文,你將熟悉shell編程中的for語句、while語句及until等語句的使用語法和應(yīng)用方法。在linux的計算方面,您將熟悉(())、let、expr、bc等計算命令的使用語法和應(yīng)用技巧。最后,您還將熟悉seq、tr、awk、sed、{1..100}等linux中的重要命令的使用技巧!

創(chuàng)新互聯(lián)專注于城區(qū)企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),購物商城網(wǎng)站建設(shè)。城區(qū)網(wǎng)站建設(shè)公司,為城區(qū)等地區(qū)提供建站服務(wù)。全流程按需設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

特別提醒:
    本博文的寫作不在于用了多少種實現(xiàn)方法,而是拋磚引玉的給朋友們帶來一個可供參考的學(xué)習(xí)思路和方法,這也是老男孩在linux運維實戰(zhàn)培訓(xùn)課堂中講課時一直所追求的。一個優(yōu)秀的老師一定要有方法把自己的知識技能真正的輸入到學(xué)生的腦袋里,這除了老男孩和學(xué)生經(jīng)常說的學(xué)好運維的四要素:目標、方法、努力、堅持。還離不開一個優(yōu)秀老師對學(xué)生思路的啟發(fā)開導(dǎo)以及通過特殊的趣味性課堂教學(xué)培養(yǎng)學(xué)生主動思考問題的能力。當然,也要培養(yǎng)學(xué)生舉一反三,的能力,讓學(xué)生們在積極主動的思考中,不知不覺的,學(xué)到了該學(xué)習(xí)到的運維技術(shù),從而養(yǎng)成良好的學(xué)習(xí)思考習(xí)慣。
    老男孩發(fā)現(xiàn),技術(shù)學(xué)不好的學(xué)生,其實不是智商問題,主要是思路、思維、方法問題。而提升學(xué)生的思維、思路、意識、思想也是老男孩linux實戰(zhàn)培訓(xùn)的核心內(nèi)容。    
老男孩linux培訓(xùn)的宗旨:培養(yǎng)有限的學(xué)生成為企業(yè)的技術(shù)精英!
這就是老男孩堅持不屑一直追求的目標!
廢話說完了,開始正題!

思路集錦:
①.C語言型for循環(huán)結(jié)構(gòu)及(())計算式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)此法中我們主要目的是學(xué)習(xí)expr命令的用法。
2)expr的效率低于(()),計算1加到100就有明顯感覺。

有關(guān)此法更詳細的信息請見老男孩linux運維實戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
-------------------------------------------------
③.使用seq命令加for循環(huán)語法及l(fā)et命令計算式腳本
[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)這里我們需要學(xué)習(xí)seq命令結(jié)合for循環(huán)的用法。
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及l(fā)et的用法,有關(guān)此法更詳細的信息請見老男孩linux運維實戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
-------------------------------------------------
④.seq、tr、sed、bc聯(lián)手完成計算的方法
[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個數(shù)字。
2.tr '\n' '+'     ==>把1...100個數(shù)字的結(jié)尾換行標簽全部換成加號,即得1+2+3...+100+。
3.sed 's#\+$#\n#g'==>拼接的字符串表達式結(jié)尾加號替換為換行(回車)符。
4.bc    ==>交給bc計算
有關(guān)此法更詳細的信息請見老男孩linux運維實戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
-------------------------------------------------
⑤.(())的其它寫法
[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
提示:以上兩結(jié)果都是對的
-------------------------------------------------
⑥.使用until語句及(())計算
[oldboy@student ~]$  cat until-1.sh
#!/bin/sh
i=1
until ((i >100 ))
do
  ((j=j+i))
  ((i++))
done
echo $j

老男孩提示:
1)這里我們主要學(xué)習(xí)until條件句的用法。
2)注意until和while語句的區(qū)別。until語句至少執(zhí)行一次循環(huán)即使條件不成立。
3)循環(huán)里的計算式可以使用expr,let等替代之。

有關(guān)此法更詳細的信息請見老男孩linux運維實戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
-------------------------------------------------
⑦.使用while循環(huán)語句計算
[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)學(xué)習(xí)while條件句的用法。
2)注意while ((i <=100 ))寫法及while [ $i -le 100 ]和while [[ $i -le 100 ]]不同替代語法。
3)注意:i=`expr $i + 1`及((i++))和let i=i+1的幾種實現(xiàn)語法。

有關(guān)此法更詳細的信息請見老男孩linux運維實戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
-------------------------------------------------
⑧.使用數(shù)學(xué)公式直接計算※※※※※
[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)學(xué)習(xí)公式算法,代碼簡單而且運算高效。
   注意:上述公式中an表示等差數(shù)列的第n項。
    高中數(shù)學(xué)求和公式 :
    Sn=n(a1+an)/2
    Sn=a1n+n(n-1)d/2 d=公差
2)對于計算1+2+3...100用前面的方法計算,大家可能感覺不到多大差別,
但是如果計算1+2+3...10000000的話,前面的除了公司計算的所有方法可能就吃不消了。
無論是運維還是開發(fā)人員都要注意,盡量使用公式或算法計算。

有關(guān)此法更詳細的信息請見老男孩linux運維實戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
3)在計算時,(())計算式比let,expr等更有效率。
-------------------------------------------------
⑨.拼接字符串計算表達式后結(jié)合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實現(xiàn)
[oldboy@student ~]$  seq 100 |awk '{total+=$1} END {print total}'
5050
[oldboy@student ~]$  seq 100 |awk '{total=total+$1} END {print total}'
5050
-------------------------------------------------
①①.{}數(shù)字列表結(jié)合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
提示:上面用法的還有更出色的表現(xiàn)。
有關(guān)此法更詳細的信息請見老男孩linux運維實戰(zhàn)培訓(xùn)的課堂講解或者評論交流。

2)seq默認情況只能是豎立排序列(以\n為分隔符號)
[oldboy@student ~]$  seq 3
1
2
3
加個-s分隔符參數(shù)看看:
[oldboy@student ~]$  seq -s " " 3
1 2 3
提示:seq僅支持打印數(shù)字序列,不支持字符等。

有關(guān)此法更詳細的信息請見老男孩linux運維實戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
-------------------------------------------------
①②.{}數(shù)字列表結(jié)合awk方法
[oldboy@student ~]$ echo {1..100}|tr " " "\n"|awk '{total+=$1} END {print total}'
5050
-------------------------------------------------
①③.{}數(shù)字列表for循環(huán)及計算命令方法
[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結(jié)合bc較少字符計算方法(壓軸了,最少字符實現(xiàn)方法)
[oldboy@student ~]$ seq -s + 100|bc
5050
[oldboy@student ~]$ seq -s "+" 100|bc
5050
老男孩提示:
1)注意seq命令-s分隔符參數(shù)的用法。
2)此法比法④強的不是一點半點。值得我們研究學(xué)習(xí)。
有關(guān)此法更詳細的信息請見老男孩linux運維實戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
本想⑩全⑩美就得,結(jié)果沒打住!
==老男孩個人介紹:

   老男孩,資深Linux系統(tǒng)運維網(wǎng)站架構(gòu)專家、高級運維總監(jiān)。從事一線網(wǎng)站運維及系統(tǒng)架構(gòu)管理近12年,曾就職于若干個大規(guī)模高并發(fā)訪問量的行業(yè)門戶網(wǎng)站,并為多家互聯(lián)網(wǎng)公司做過技術(shù)顧問,擅長大規(guī)模網(wǎng)站系統(tǒng)架構(gòu)解決方案。于2007年開辦了國內(nèi)首個linux運維實戰(zhàn)培訓(xùn)私塾式精英教育機構(gòu)。并將個人的網(wǎng)站運維架構(gòu)及教育領(lǐng)域的經(jīng)驗成功應(yīng)用到IT教育領(lǐng)域教學(xué)工作。累計受益學(xué)生千余人(其中面授學(xué)生達200余人,部分學(xué)生就職于淘寶、阿里巴巴、百度、開心網(wǎng)、激動網(wǎng)、小米科技、土豆、酷六、sohu、sina、金山、尚德,chinacache,快網(wǎng)、遨游、趕集、拉手網(wǎng),窩窩團、就業(yè)工場、聯(lián)通、電信等眾多國內(nèi)知名公司)。

老男孩目前從事的工作:

1)老男孩linux運維實戰(zhàn)培訓(xùn)機構(gòu)精英辦學(xué)。

2)提供企業(yè)技術(shù)培訓(xùn)及技術(shù)顧問服務(wù)。

3)提供各種網(wǎng)站系統(tǒng)架構(gòu)(數(shù)據(jù)庫)解決方案。

4)提供linux技術(shù)方向企業(yè)雇員雙向獵頭、HR服務(wù)。

5)提供優(yōu)質(zhì)linux運維原創(chuàng)系列視頻。

6)linux運維及開發(fā)類圖書寫作。

老男孩的聯(lián)系方式:

名字:老男孩

QQ號:31333741 

信箱:31333741@qq.com

個人博客:

http://oldboy.blog.51cto.com(運維技術(shù)分享地)

個人微博:

http://t.qq.com/tt31333741(運維思想分享地)

http://weibo.com/oldboy8

網(wǎng)站運維交流群:114580181 45039636 37081784
======================================================
老男孩linux運維實戰(zhàn)培訓(xùn)咨詢方式
咨詢:QQ:357851641 31333741 70271111
電話:18911718229
網(wǎng)站地址:http://www.etiantian.org  http://oldboy.cc
blog:http://oldboy.blog.51cto.com
======================================================
(全文完)

文章題目:linuxbashshell腳本的數(shù)學(xué)運算符(()),let,expr的效率比較
鏈接URL:http://muchs.cn/article4/ihpoie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、電子商務(wù)、商城網(wǎng)站網(wǎng)站改版、云服務(wù)器、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司