原題:經過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實戰培訓的核心內容。
老男孩linux培訓的宗旨:培養有限的學生成爲企業的技術精英!
這就是老男孩堅持不屑一直追求的目標!
廢話說完了,開始正題!算法
思路集錦:
①.C語言型for循環結構及(())計算式shell腳本
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命令的計算語法。bash
提示: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餘人,部分學生就任於淘寶、阿里巴巴、百度、開心網、激動網、小米科技、土豆、酷6、sohu、sina、金山、尚德,chinacache,快網、遨遊、趕集、拉手網,窩窩團、就業工場、聯通、電信等衆多國內知名公司)。
老男孩目前從事的工做:
1) 老男孩linux運維實戰培訓機構精英辦學。
2)提供企業技術培訓及技術顧問服務。
3)提供各類網站系統架構(數據庫)解決方案。
4)提供linux技術方向企業僱員雙向獵頭、HR服務。
5)提供優質linux運維原創系列視頻。
6)linux運維及開發類圖書寫做。
老男孩的聯繫方式:
名字:老男孩
QQ號:31333741
我的博客:
http://oldboy.blog.51cto.com(運維技術分享地)
我的微博:
http://t.qq.com/tt31333741(運維思想分享地)
網站運維交流羣: 114580181 45039636 37081784
======================================================
老男孩linux運維實戰培訓諮詢方式
諮詢:QQ:357851641 31333741 70271111
電話:18911718229
網站地址:http://www.etiantian.org http://oldboy.cc blog:http://oldboy.blog.51cto.com ====================================================== (全文完)