?? why-shell.html
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>為什么使用shell編程?</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高級(jí)Bash腳本編程指南"HREF="index.html"><LINKREL="UP"TITLE="熱身"HREF="part1.html"><LINKREL="PREVIOUS"TITLE="熱身"HREF="part1.html"><LINKREL="NEXT"TITLE="帶著一個(gè)Sha-Bang出發(fā)(Sha-Bang指的是#!)"HREF="sha-bang.html"></HEAD><BODYCLASS="CHAPTER"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高級(jí)Bash腳本編程指南: 一本深入學(xué)習(xí)shell腳本藝術(shù)的書籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="part1.html"ACCESSKEY="P">前一頁</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom"></TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="sha-bang.html"ACCESSKEY="N">下一頁</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="CHAPTER"><H1><ANAME="WHY-SHELL"></A>1. 為什么使用shell編程?</H1><TABLEBORDER="0"WIDTH="100%"CELLSPACING="0"CELLPADDING="0"CLASS="EPIGRAPH"><TR><TDWIDTH="45%"> </TD><TDWIDTH="45%"ALIGN="LEFT"VALIGN="TOP"><I><P><I>沒有程序語言是完美的. 甚至沒有一個(gè)唯一最好的語言, 只有對(duì)于特定目的, 比較適合和不適合的程序語言.</I></P></I></TD></TR><TR><TDWIDTH="45%"> </TD><TDWIDTH="45%"ALIGN="RIGHT"VALIGN="TOP"><I><SPANCLASS="ATTRIBUTION">Herbert Mayer</SPAN></I></TD></TR></TABLE><P>對(duì)于任何想適當(dāng)精通一些系統(tǒng)管理知識(shí)的人來說, 掌握shell腳本知識(shí)都是最基本的, 即使這些人可能并不打算真正的編寫一些腳本. 想一下Linux機(jī)器的啟動(dòng)過程, 在這個(gè)過程中, 必將運(yùn)行<TTCLASS="FILENAME">/etc/rc.d</TT>目錄下的腳本來存儲(chǔ)系統(tǒng)配置和建立服務(wù). 詳細(xì)的理解這些啟動(dòng)腳本對(duì)于分析系統(tǒng)的行為是非常重要的, 并且有時(shí)候可能必須修改它. </P><P>學(xué)習(xí)如何編寫shell腳本并不是一件很困難的事, 因?yàn)槟_本可以分為很小的塊, 并且相對(duì)于shell特性的操作和選項(xiàng) <ANAME="AEN112"HREF="#FTN.AEN112"><SPANCLASS="footnote">[1]</SPAN></A>部分,只需要學(xué)習(xí)很小的一部分就可以了. 語法是簡(jiǎn)單并且直觀的, 編寫腳本很像是在命令行上把一些相關(guān)命令和工具連接起來, 并且只有很少的一部分<SPANCLASS="QUOTE">"規(guī)則"</SPAN>需要學(xué)習(xí). 絕大部分腳本第一次就可以正常的工作, 而且即使調(diào)試一個(gè)長(zhǎng)一些的腳本也是很直觀的. </P><P>一個(gè)shell腳本是一個(gè)類似于<SPANCLASS="QUOTE">"小吃店的(quick and dirty)"</SPAN>方法, 在你使用原型設(shè)計(jì)一個(gè)復(fù)雜的應(yīng)用的時(shí)候. 在工程開發(fā)的第一階段, 即使從功能中取得很有限的一個(gè)子集放到shell腳本中來完成往往都是非常有用的. 使用這種方法, 程序的結(jié)果可以被測(cè)試和嘗試運(yùn)行, 并且在處理使用諸如C/C++, Java或者Perl語言編寫的最終代碼前, 主要的缺陷和陷阱往往就被發(fā)現(xiàn)了. </P><P>Shell腳本遵循典型的UNIX哲學(xué), 就是把大的復(fù)雜的工程分成小規(guī)模的子任務(wù), 并且把這些部件和工具組合起來. 許多人認(rèn)為這種辦法更好一些, 至少這種辦法比使用那種高\(yùn)大\全的語言更美, 更愉悅, 更適合解決問題. 比如Perl就是這種能干任何事能適合任何人的語言, 但是代價(jià)就是你需要強(qiáng)迫自己使用這種語言來思考解決問題的辦法. </P><P>什么時(shí)候不適合使用Shell腳本 <P></P><UL><LI><P>資源密集型的任務(wù), 尤其在需要考慮效率時(shí)(比如, 排序, hash等等). </P></LI><LI><P>需要處理大任務(wù)的數(shù)學(xué)操作, 尤其是浮點(diǎn)運(yùn)算, 精確運(yùn)算, 或者復(fù)雜的算術(shù)運(yùn)算(這種情況一般使用C++或FORTRAN來處理). </P></LI><LI><P>有跨平臺(tái)移植需求(一般使用C或Java). </P></LI><LI><P>復(fù)雜的應(yīng)用, 在必須使用結(jié)構(gòu)化編程的時(shí)候(需要變量的類型檢查, 函數(shù)原型, 等等). </P></LI><LI><P>至關(guān)重要的應(yīng)用, 比如說為了這個(gè)應(yīng)用, 你需要賭上自己的農(nóng)場(chǎng), 甚至賭上你們公司的未來. </P></LI><LI><P>對(duì)于安全有很高要求的任務(wù), 比如你需要一個(gè)健壯的系統(tǒng)來防止入侵, 破解, 惡意破壞等等. </P></LI><LI><P>工程的每個(gè)組成部分之間, 需要連鎖的依賴性. </P></LI><LI><P>需要大規(guī)模的文件操作(Bash受限于順序地進(jìn)行文件訪問, 而且只能使用這種笨拙的效率低下的一行接一行的處理方式. ). </P></LI><LI><P>需要多維數(shù)組的支持. </P></LI><LI><P>需要數(shù)據(jù)結(jié)構(gòu)的支持,比如鏈表或數(shù)組等數(shù)據(jù)結(jié)構(gòu). </P></LI><LI><P>需要產(chǎn)生或操作圖形化界面GUI. </P></LI><LI><P>需要直接操作系統(tǒng)硬件. </P></LI><LI><P>需要I/O或socket接口. </P></LI><LI><P>需要使用庫或者遺留下來的舊代碼的接口. </P></LI><LI><P>個(gè)人的, 閉源的應(yīng)用(shell腳本把代碼就放在文本文件中, 全世界都能看到). </P></LI></UL></P><P>如果你的應(yīng)用符合上邊的任意一條, 那么就考慮一下更強(qiáng)大的語言吧--或許是Perl, Tcl, Python, Ruby -- 或者是更高層次的編譯語言比如C/C++, 或者是Java. 即使如此, 你會(huì)發(fā)現(xiàn), 使用shell來原型開發(fā)你的應(yīng)用, 在開發(fā)步驟中也是非常有用的. </P><P>我們將開始使用<ACRONYMCLASS="ACRONYM">Bash</ACRONYM>, Bash是<SPANCLASS="QUOTE">"Bourne-Again shell"</SPAN>首字母的縮寫, 也是Stephen Bourne的經(jīng)典的Bourne shell的一個(gè)雙關(guān)語, (譯者: 說實(shí)話, 我一直搞不清這個(gè)雙關(guān)語是什么意思, 為什么叫"Bourn-Again shell", 這其中應(yīng)該有個(gè)什么典故吧, 哪位好心, 告訴我一下^^). 對(duì)于所有UNIX上的shell腳本來說, Bash已經(jīng)成為了<ICLASS="FOREIGNPHRASE">事實(shí)上</I>的標(biāo)準(zhǔn)了. 同時(shí)這本書也覆蓋了絕大部分的其他一些shell的原則, 比如Korn Shell, Bash從ksh中繼承了一部分特性, <ANAME="AEN156"HREF="#FTN.AEN156"><SPANCLASS="footnote">[2]</SPAN></A> C Shell和它的變種. (注意: C Shell編程是不被推薦的, 因?yàn)橐恍┨囟ǖ膬?nèi)在問題, Tom Christiansen在1993年10月上的<AHREF="http://www.etext.org/Quartz/computer/unix/csh.harmful.gz"TARGET="_top">Usenet post</A>指出了這個(gè)問題). </P><P>接下來是腳本的一些說明. 在展示shell不同的特征之前, 它可以減輕一些閱讀書中例子的負(fù)擔(dān). 本書中的例子腳本, 都在盡可能的范圍內(nèi)進(jìn)行了測(cè)試, 并且其中的一些將使用在真實(shí)的生活中. 讀者可以運(yùn)行這些例子腳本(使用<TTCLASS="FILENAME">scriptname.sh</TT>或者<TTCLASS="FILENAME">scriptname.bash</TT>的形式), <ANAME="AEN164"HREF="#FTN.AEN164"><SPANCLASS="footnote">[3]</SPAN></A> 并給這些腳本執(zhí)行權(quán)限(<KBDCLASS="USERINPUT">chmod u+rx scriptname</KBD>), 然后執(zhí)行它們, 看看發(fā)生了什么. 如果你沒有相應(yīng)的源代碼, 那么就從本書的 <AHREF="http://www.tldp.org/LDP/abs/abs-guide.html.tar.gz"TARGET="_top">HTML</A>, <AHREF="http://www.tldp.org/LDP/abs/abs-guide.pdf"TARGET="_top">pdf</A>, 或者<AHREF="http://www.ibiblio.org/pub/Linux/docs/linux-doc-project/abs-guide/abs-guide.txt.gz"TARGET="_top">text</A>版本中將這些源代碼拷貝出來. 考慮到這些腳本中的內(nèi)容在我們還沒解釋它之前就被列在這里, 可能會(huì)影響讀者的理解, 這就需要讀者暫時(shí)忽略這些內(nèi)容. </P><P>除非特別注明, 本書<AHREF="mailto:thegrendel@theriver.com"TARGET="_top">作者</A>編寫了本書中的絕大部分例子腳本. </P></DIV><H3CLASS="FOOTNOTES">注意事項(xiàng)</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN112"HREF="why-shell.html#AEN112"><SPANCLASS="footnote">[1]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>這些將在<AHREF="internal.html#BUILTINREF">內(nèi)建</A>章節(jié)被引用, 這些都是shell的內(nèi)部特征. </P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN156"HREF="why-shell.html#AEN156"><SPANCLASS="footnote">[2]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P><EM>ksh88</EM>的許多特性,甚至是一些<EM>ksh93</EM>的特性都被合并到Bash中了. </P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN164"HREF="why-shell.html#AEN164"><SPANCLASS="footnote">[3]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>根據(jù)慣例,用戶編寫的Bourne shell腳本應(yīng)該在腳本的名字后邊加上<TTCLASS="FILENAME">.sh</TT>擴(kuò)展名. 一些系統(tǒng)腳本, 比如那些在<TTCLASS="FILENAME">/etc/rc.d</TT>中的腳本,則不遵循這種命名習(xí)慣. </P></TD></TR></TABLE><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="part1.html"ACCESSKEY="P">前一頁</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首頁</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="sha-bang.html"ACCESSKEY="N">下一頁</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">熱身</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="part1.html"ACCESSKEY="U">上一級(jí)</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">帶著一個(gè)Sha-Bang出發(fā)(Sha-Bang指的是#!)</TD></TR></TABLE></DIV></BODY></HTML>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -