您好,登錄后才能下訂單哦!
博文前言:
本博文為《老男孩linux就業(yè)培訓(xùn)中心-初級班第七期課前考試及課上講解的課后答案整理,
原題:通過shell編程或命令行方式求1+2+3...+100=?的和來活學(xué)活用shell及l(fā)inux命令。
閱讀完本博文,你將熟悉shell編程中的for語句、while語句及until等語句的使用語法和應(yīng)用方法。在linux的計(jì)算方面,您將熟悉(())、let、expr、bc等計(jì)算命令的使用語法和應(yīng)用技巧。最后,您還將熟悉seq、tr、awk、sed、{1..100}等linux中的重要命令的使用技巧!
特別提醒:
本博文的寫作不在于用了多少種實(shí)現(xiàn)方法,而是拋磚引玉的給朋友們帶來一個可供參考的學(xué)習(xí)思路和方法,這也是老男孩在linux運(yùn)維實(shí)戰(zhàn)培訓(xùn)課堂中講課時一直所追求的。一個優(yōu)秀的老師一定要有方法把自己的知識技能真正的輸入到學(xué)生的腦袋里,這除了老男孩和學(xué)生經(jīng)常說的學(xué)好運(yùn)維的四要素:目標(biāo)、方法、努力、堅(jiān)持。還離不開一個優(yōu)秀老師對學(xué)生思路的啟發(fā)開導(dǎo)以及通過特殊的趣味性課堂教學(xué)培養(yǎng)學(xué)生主動思考問題的能力。當(dāng)然,也要培養(yǎng)學(xué)生舉一反三,的能力,讓學(xué)生們在積極主動的思考中,不知不覺的,學(xué)到了該學(xué)習(xí)到的運(yùn)維技術(shù),從而養(yǎng)成良好的學(xué)習(xí)思考習(xí)慣。
老男孩發(fā)現(xiàn),技術(shù)學(xué)不好的學(xué)生,其實(shí)不是智商問題,主要是思路、思維、方法問題。而提升學(xué)生的思維、思路、意識、思想也是老男孩linux實(shí)戰(zhàn)培訓(xùn)的核心內(nèi)容。
老男孩linux培訓(xùn)的宗旨:培養(yǎng)有限的學(xué)生成為企業(yè)的技術(shù)精英!
這就是老男孩堅(jiān)持不屑一直追求的目標(biāo)!
廢話說完了,開始正題!
思路集錦:
①.C語言型for循環(huán)結(jié)構(gòu)及(())計(jì)算式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的效率低于(()),計(jì)算1加到100就有明顯感覺。
有關(guān)此法更詳細(xì)的信息請見老男孩linux運(yùn)維實(shí)戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
-------------------------------------------------
③.使用seq命令加for循環(huán)語法及l(fā)et命令計(jì)算式腳本
[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命令的計(jì)算語法。
提示: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)此法更詳細(xì)的信息請見老男孩linux運(yùn)維實(shí)戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
-------------------------------------------------
④.seq、tr、sed、bc聯(lián)手完成計(jì)算的方法
[oldboy@student ~]$ seq 100 | tr '\n' '+'|sed 's#\+$#\n#g'|bc
5050
老男孩提示:
1)注意bc命令的計(jì)算用法。
2)注意seq、tr、sed 3個命令的用法。
3) 命令解釋說明:
1.seq 100 ==>豎排打印1...100個數(shù)字。
2.tr '\n' '+' ==>把1...100個數(shù)字的結(jié)尾換行標(biāo)簽全部換成加號,即得1+2+3...+100+。
3.sed 's#\+$#\n#g'==>拼接的字符串表達(dá)式結(jié)尾加號替換為換行(回車)符。
4.bc ==>交給bc計(jì)算
有關(guān)此法更詳細(xì)的信息請見老男孩linux運(yùn)維實(shí)戰(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語句及(())計(jì)算
[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)里的計(jì)算式可以使用expr,let等替代之。
有關(guān)此法更詳細(xì)的信息請見老男孩linux運(yùn)維實(shí)戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
-------------------------------------------------
⑦.使用while循環(huán)語句計(jì)算
[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的幾種實(shí)現(xiàn)語法。
有關(guān)此法更詳細(xì)的信息請見老男孩linux運(yùn)維實(shí)戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
-------------------------------------------------
⑧.使用數(shù)學(xué)公式直接計(jì)算※※※※※
[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í)公式算法,代碼簡單而且運(yùn)算高效。
注意:上述公式中an表示等差數(shù)列的第n項(xiàng)。
高中數(shù)學(xué)求和公式 :
Sn=n(a1+an)/2
Sn=a1n+n(n-1)d/2 d=公差
2)對于計(jì)算1+2+3...100用前面的方法計(jì)算,大家可能感覺不到多大差別,
但是如果計(jì)算1+2+3...10000000的話,前面的除了公司計(jì)算的所有方法可能就吃不消了。
無論是運(yùn)維還是開發(fā)人員都要注意,盡量使用公式或算法計(jì)算。
有關(guān)此法更詳細(xì)的信息請見老男孩linux運(yùn)維實(shí)戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
3)在計(jì)算時,(())計(jì)算式比let,expr等更有效率。
-------------------------------------------------
⑨.拼接字符串計(jì)算表達(dá)式后結(jié)合bc求和計(jì)算方法
[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實(shí)現(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)此法更詳細(xì)的信息請見老男孩linux運(yùn)維實(shí)戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
2)seq默認(rèn)情況只能是豎立排序列(以\n為分隔符號)
[oldboy@student ~]$ seq 3
1
2
3
加個-s分隔符參數(shù)看看:
[oldboy@student ~]$ seq -s " " 3
1 2 3
提示:seq僅支持打印數(shù)字序列,不支持字符等。
有關(guān)此法更詳細(xì)的信息請見老男孩linux運(yùn)維實(shí)戰(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)及計(jì)算命令方法
[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較少字符計(jì)算方法(壓軸了,最少字符實(shí)現(xiàn)方法)
[oldboy@student ~]$ seq -s + 100|bc
5050
[oldboy@student ~]$ seq -s "+" 100|bc
5050
老男孩提示:
1)注意seq命令-s分隔符參數(shù)的用法。
2)此法比法④強(qiáng)的不是一點(diǎn)半點(diǎn)。值得我們研究學(xué)習(xí)。
有關(guān)此法更詳細(xì)的信息請見老男孩linux運(yùn)維實(shí)戰(zhàn)培訓(xùn)的課堂講解或者評論交流。
本想⑩全⑩美就得,結(jié)果沒打?。?br />
==老男孩個人介紹:
老男孩,資深Linux系統(tǒng)運(yùn)維網(wǎng)站架構(gòu)專家、高級運(yùn)維總監(jiān)。從事一線網(wǎng)站運(yùn)維及系統(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運(yùn)維實(shí)戰(zhàn)培訓(xùn)私塾式精英教育機(jī)構(gòu)。并將個人的網(wǎng)站運(yùn)維架構(gòu)及教育領(lǐng)域的經(jīng)驗(yàn)成功應(yīng)用到IT教育領(lǐng)域教學(xué)工作。累計(jì)受益學(xué)生千余人(其中面授學(xué)生達(dá)200余人,部分學(xué)生就職于淘寶、阿里巴巴、百度、開心網(wǎng)、激動網(wǎng)、小米科技、土豆、酷六、sohu、sina、金山、尚德,chinacache,快網(wǎng)、遨游、趕集、拉手網(wǎng),窩窩團(tuán)、就業(yè)工場、聯(lián)通、電信等眾多國內(nèi)知名公司)。
老男孩目前從事的工作:
1) 老男孩linux運(yùn)維實(shí)戰(zhàn)培訓(xùn)機(jī)構(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運(yùn)維原創(chuàng)系列視頻。
6)linux運(yùn)維及開發(fā)類圖書寫作。
老男孩的聯(lián)系方式:
名字:老男孩
QQ號:31333741
信箱:31333741@qq.com
個人博客:
http://oldboy.blog.51cto.com(運(yùn)維技術(shù)分享地)
個人微博:
http://t.qq.com/tt31333741(運(yùn)維思想分享地)
http://weibo.com/oldboy8
網(wǎng)站運(yùn)維交流群: 114580181 45039636 37081784
======================================================
老男孩linux運(yùn)維實(shí)戰(zhàn)培訓(xùn)咨詢方式
咨詢:QQ:357851641 31333741 70271111
電話:18911718229
網(wǎng)站地址:http://www.etiantian.org http://oldboy.cc
blog:http://oldboy.blog.51cto.com
======================================================
(全文完)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。