您好,登錄后才能下訂單哦!
博文前言:
本博文為《老男孩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余人,部分學生就職于淘寶、阿里巴巴、百度、開心網、激動網、小米科技、土豆、酷六、sohu、sina、金山、尚德,chinacache,快網、遨游、趕集、拉手網,窩窩團、就業工場、聯通、電信等眾多國內知名公司)。
老男孩目前從事的工作:
1) 老男孩linux運維實戰培訓機構精英辦學。
2)提供企業技術培訓及技術顧問服務。
3)提供各種網站系統架構(數據庫)解決方案。
4)提供linux技術方向企業雇員雙向獵頭、HR服務。
5)提供優質linux運維原創系列視頻。
6)linux運維及開發類圖書寫作。
老男孩的聯系方式:
名字:老男孩
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
======================================================
(全文完)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。