<menu id="4oq46"><strong id="4oq46"></strong></menu>
  • <menu id="4oq46"><menu id="4oq46"></menu></menu><input id="4oq46"><tt id="4oq46"></tt></input>
  • <tt id="4oq46"><strong id="4oq46"></strong></tt>
    <menu id="4oq46"><strong id="4oq46"></strong></menu>
      免費注冊 查看新帖 |

    Chinaunix

      平臺 論壇 博客 文庫
    最近訪問板塊 發新帖
    查看: 1757295 | 回復: 799
    打印 上一主題 下一主題

    [學習共享] shell 十三問? [復制鏈接]

    論壇徽章:
    1
    榮譽版主
日期:2011-11-23 16:44:17
    跳轉到指定樓層
    1 [收藏(0)] [報告]
    發表于 2003-12-09 02:48 |只看該作者 |倒序瀏覽
    我在 CU 的日子並不長,有幸在 shell 版上與大家結緣。
    除了跟眾前輩學習到不少技巧之外,也?吹讲簧倥笥训膯栴}。
    然而,在眾多問題中,我發現許多瓶頸都源於 shell 的基礎而已。
    每次要解說,卻總有千言萬語不知從何起之感...

    這次,我不是來回答,而是準備了關於 shell 基礎的十三個問題要問大家﹗
    希望 shell 學習者們能夠透過尋找答案的過程,好好的將 shell 基礎打紮實一點...
    當然了,這些問題我也會逐一解說一遍。只是,我不敢保證甚麼時候能夠完成這趟任務。
    除了時間關係外,個人功力實在有限,很怕匆忙間誤導觀眾就糟糕了。
    若能拋磚引玉,誘得其他前輩出馬補充,那才真的是功德一件﹗

    shell 十三問:

    1) 為何叫做 shell ?
    http://www.cesargiobbi.com/viewthr ... p;page=2#pid1454336
    2) shell prompt(PS1) 與 Carriage Return(CR) 的關係? (2008-10-30 02:05 最後更新)
    http://www.cesargiobbi.com/viewthr ... p;page=2#pid1467910
    3) 別人 echo、你也 echo ,是問 echo 知多少?( 2008-10-30 02:08 最後更新)
    http://www.cesargiobbi.com/viewthr ... p;page=3#pid1482452
    4) " "(雙引號) 與 ' '(單引號)差在哪?  (2008-10-30 02:07 最後更新)
    http://www.cesargiobbi.com/viewthr ... p;page=4#pid1511745
    5) var=value?export 前後差在哪? (2008-10-30 02:12 最後更新)
    http://www.cesargiobbi.com/viewthr ... p;page=5#pid1544391
    6) exec 跟 source 差在哪? (2008-10-30 02:17 最後更新)
    http://www.cesargiobbi.com/viewthr ... p;page=6#pid1583329
    7) ( ) 與 { } 差在哪?
    http://www.cesargiobbi.com/viewthr ... p;page=6#pid1595135
    8) $(( )) 與 $( ) 還有${ } 差在哪? (2008-10-30 02:20 最後更新)
    http://www.cesargiobbi.com/viewthr ... p;page=7#pid1617953
    9) $@ 與 $* 差在哪?
    http://www.cesargiobbi.com/viewthr ... p;page=7#pid1628522
    10) && 與 || 差在哪? (2008-10-30 02:21 最後更新)
    http://www.cesargiobbi.com/viewthr ... p;page=7#pid1634118
    11) > 與 < 差在哪? (2008-10-30 02:24 最後更新)
    http://www.cesargiobbi.com/viewthr ... p;page=7#pid1636825
    12) 你要 if 還是 case 呢? (2008-10-30 02:25最後更新)
    http://www.cesargiobbi.com/viewthr ... p;page=8#pid1679488
    13) for what? while 與 until 差在哪? (2008-10-30 02:26最後更新)
    http://www.cesargiobbi.com/viewthr ... p;page=8#pid1692457

    補充問題:
    b1) [^ ] 跟 [! ] 差在哪?
    Part-I(Wildcard): (2008-10-30 02:25 最後更新)
    http://www.cesargiobbi.com/viewthr ... ;page=16#pid2930144
    Part-II(Regular Expression): (2008-10-30 02:26 最後更新)
    http://www.cesargiobbi.com/viewthr ... ;page=16#pid2934852


    --------------
    說明:
    1) 歡迎大家補充/擴充問題。
    2) 我接觸電腦中文名稱時是在臺灣,因此一些術語或與大陸不同,請自行轉換。
    3) 我會不定時"逐題"說明(以 Linux 上的 bash 為環境)。同時,也會在任何時候進行無預警修改。請讀者自行留意。
    4) 本人於本系列所發表的任文章均可自由以電子格式(非印刷)引用、修改、轉載,且不必註明出處(若能註明 CU 更佳)。
    當然,若有錯漏或不當結果,本人也不負任何責任。
    5) 若有人願意整理成冊且付印者,本人僅保留著作權,版權收益之 30% 須捐贈與 CU 論壇管理者,剩餘不究。

    ---------
    建議參考討論:
    1) shaoping0330 兄關於變量替換的補充:
    (連結在改版後已經失效)

    2) shaoping0330 兄關於 RE 的說明:
    http://www.cesargiobbi.com/forum/viewtopic.php?t=393964

    3) 關於 nested subshell 的討論:
    (連結在改版後已經失效)

    4) 關於 IFS 的討論:
    http://www.cesargiobbi.com/forum/viewtopic.php?t=512925

    ---------
    * 感謝 lkydeer 兄整理 word/pdf 版本方便大家參考:
    http://www.cesargiobbi.com/viewthr ... &extra=page%3D2

    [ 本帖最后由 網中人 于 2008-11-4 02:12 編輯 ]

    評分

    參與人數 2可用積分 +5 信譽積分 +5 收起 理由
    substr函數 + 5 贊一個!
    mocou + 5 精品文章

    查看全部評分

    論壇徽章:
    0
    2 [報告]
    發表于 2003-12-09 02:54 |只看該作者

    shell 十三問?

    感謝版主~~ 我也在學習Shell編程,開始打個好基礎。

    論壇徽章:
    1
    榮譽版主
日期:2011-11-23 16:44:17
    3 [報告]
    發表于 2003-12-09 07:24 |只看該作者

    shell 十三問?

    很有“殺傷力”的問題,希望大家踴躍參與,共同商榷!

    論壇徽章:
    0
    4 [報告]
    發表于 2003-12-09 09:01 |只看該作者

    shell 十三問?

    好問題!值得仔細琢磨琢磨...

    論壇徽章:
    0
    5 [報告]
    發表于 2003-12-09 09:53 |只看該作者

    shell 十三問?

    暈了~~這些題我一個也說不清楚
        

    論壇徽章:
    0
    6 [報告]
    發表于 2003-12-09 10:17 |只看該作者

    shell 十三問?

    只想知道答案。

    論壇徽章:
    0
    7 [報告]
    發表于 2003-12-09 10:31 |只看該作者

    shell 十三問?

    關于第一個問題,什么是shell

    作者:Rick Rummel


    介紹
    你可以做許多事情而不必知道它們實際上如何運作。比如,你不必懂得發動機燃燒的物理原理就可以開汽車。缺乏電子知識也不會阻止
    你用CD機聽音樂。不知道什么是Shell和它的工作原理,你還是可以使用UNIX。但是,知道這些你可以更好地利用UNIX。
    一個UNIX系統有三種具有代表性的Shell可用:Bourne
    shell,Korn shell,C shells。它們會在11,12,13章討論。在這一章中,你會學到:

    什么是Shell
    Shell可以為你做什么
    Shell和整個系統的關系



    內核與Shell


    堅果的殼保護其內部的核,同樣一個UNIX
    shell提供一個外設的保護層。當你啟動一臺基于UNIX的計算機時,UNIX的程序被調入計算機的內存里,直到你關機。這個程序叫做內
    核(kernel),它執行許多底級和系統級的工作。內核有責任解釋基本指令并將其送到處理器。內核也負責運行和調度進程,以及執行所
    有的輸入輸出。內核是UNIX系統的心臟,內核有且只有一個。

    你也許對內核職責的關鍵性有點迷惑,而內核指令同樣的復雜和高技術性。為了對用戶屏蔽內核的復雜性,也為了保護內核以免用戶誤操
    作造成損害,在內核的周圍建了一個外殼(shell)。用戶向shell提出請求,shell解釋并將請求傳給內核。這一節剩下的部分解釋這個外層
    是如何建立的。

    一旦內核調入內存,他就準備執行用戶的請求。然而,用戶首先得連接登錄,然后發出請求。不管怎樣,用戶登錄,內核必須知道用戶是
    誰以及如何與他通話。為了做到這點,內核調用兩個特殊的程序,getty和login.對應每個用戶的登錄點--通常稱為一個tty--內核調用
    getty程序。這個過程被稱為spawning(spawn原意是產卵)。getty顯示一個登錄提示,接著不斷地監視通話點等待用戶名的輸入。當
    getty取得任何輸入時,它便調用login程序。login建立用戶的身份并驗證他登錄的權利。login程序檢查password(密碼)文件。如果用
    戶輸入的密碼不正確,控制將從登錄點返回到getty。如果正確,login調用password文件里用戶條目中所記錄的程序并將控制交給它。這
    個程序也許是一個字處理軟件或者是電子表格程序,不過一般是被稱為shell的程序。

    假設有四個用戶已經登錄進系統。這四個用戶中,有兩個正使用Bourne shell,一個使用Korn
    shell,還有一個使用電子表格程序。每一個用戶都得到一份shell的拷貝以服務它的請求,但是內核只有一個。使用shell不會阻礙用戶使用
    電子表格或別的程序,但那些程序是運行在活動的shell下的。shell是一個單一用戶專用的程序,它在用戶和UNIX內核之間提供了一個界
    面。

    你不必一定要使用shell來存取UNIX。上面的例子中,有個用戶使用電子表格取代了shell。當這個用戶登錄進來時,電子表格程序啟動。
    當它退出電子表格程序時,他也就退出了系統。當強調安全性或者希望將用戶與任何UNIX的界面屏蔽開時,這個技術挺有用。缺點是用
    戶不能使用mail或其他UNIX的功能。

    因為login后可以執行任何程序--shell只是簡單的一個程序--你就有可能編寫自己的shell。事實上,三個獨立開發的shell已經成為UNIX
    標準的一部分。它們是:


    Bourne shell,由Stephen Bourne開發
    Korn shell,由David Korn開發
    C shell,由Bill Joy開發

    shell的多樣性使你可以選擇最適合你或者你感到最親近的界面。



    shell的功能



    不過你選擇哪個標準的shell并沒有多大關系,因為三個shell都有相同的目的:在UNIX下為用戶提供一個界面。為了達到這個目標,三個
    shell都提供了相同的基本功能:


    命令行解釋功能
    啟動程序
    輸入輸出重定向
    管道連接
    文件名置換
    變量維護
    環境控制
    shell編程


    命令行解釋



    當你登錄進來,啟動一個交互式的shell時,你會看到一個shell提示,通常是$,%或者#符號的形式。當你在提示符下敲進一行字符后,
    shell就試圖解釋它。shell提示符下的輸入有時被稱為一個命令行。命令行的基本格式是
    command arguments
    命令名 參數(一個或多個))

    command(命令)是可執行的UNIX命令,程序,實用工具,或shell程序。arguments(參數)被傳遞給執行程序。大多數的UNIX實
    用程序要求參數有以下的格式:
    option filenames
    選項 文件名(一個或多個))

    舉個例子,在命令行下有

    $ ls -l
    file1 file2

    在這個命令行中有三個參數傳遞給ls,第一個是個選項,剩下的兩個是文件名。shell為內核所做的事情之一是減少不需要的信息。對于計
    算機,空白(whit-espace)是一類無用信息;因此,有必要知道shell在遇到空白時做了些什么?瞻子煽崭,水平制表符和換行符組成。
    考慮這個例子:

    $ echo part A part B part C

    part A part B part C

    這兒將命令行解釋為有六個參數的echo命令并刪除了參數之間的空白。假設如果你正在打印報告頭想保留空白,你就得用引號將數據括起
    來就象下面所示:

    $echo part A part B part C

    part A part B part C

    單引號阻止shell檢查引號里面,F在shell將這一行解釋為帶一個參數的echo命令,而這個參數正好是包含空白的字符串。

     

    啟動程序


    當shell解釋完命令行后,它就啟動命令行中要求的程序。實際是內核執行這個程序。為了啟動程序執行,shell在PATH環境變量指定的目
    錄中搜索可執行文件。當它找到這個文件,就啟動一個子shell來運行程序。你應該知道子shell不必影響它父親的環境設置而建立和操縱自
    己的環境。比如一個子shell可以改變它的工作目錄,當它運行完后,其父shell的工作目錄仍保持不變。

     

    輸入輸出重定向



    shell在執行程序前進行重定向?紤]下面兩個例子,其中使用wc單詞統計工具統計有五行的數據文件:

    $wc -l fivelines

    5 fivelines

    $wc -l 5

    這里有一點微小的差異。在第一個例子中,wc知道它應該出去尋找名為fivelines的文件并對其進行操作。因為wc知道文件名,所以它將其
    顯示給用戶。在第二個例子中,wc僅看到數據而不知道這些數據從那里來,因為shell做了定位和重定向數據到wc的工作,也因此wc無法
    顯示文件名。

     

    管道連接

      管道是輸入輸出重定向的特例,它將一個命令的輸出直接連到另一個命令的輸入,因此管道也是在調用程序前建立的?紤]下面的命
    令行:

    $who|wc -l

    5

    shell沒將who的輸出顯示到屏幕上,而是定向到wc的輸入。

     

    文件名置換

     


    shell有責任進行文件名的替換。shell在執行程序前做替換。舉個例子:

    $echo
    *

    file1 file2 file3 file3x file4

    這兒,星號被擴展為五個文件名,并被傳遞給echo作為五個參數。如果你想顯示一個星號,你應該用引號將它括起來。

       

    變量維護

      

    shell有能力進行變量維護。變量是存儲數據為將來所用的場所。用等號(=)可以給變量賦值。

    $LOOKUP=/usr/mydir

    在這里,shell建立一個LOOKUP變量,并將/usr/mydir賦給它。稍后,你可以在命令行上通過在變量名之前加$符號來使用變量值?紤]
    這些例子:

    $echo $LOOKUP

    /usr/mydir

    $echo LOOKUP

    LOOKUP



    C-shell的用戶應該注意:C-shell中的賦值不同于Bourne和Korn
    shell。C-shell使用set命令進行賦值。

    $set LOOKUP =
    /usr/mydir

    注意在等號兩邊要加空格。



    就象文件名的置換一樣,變量名的置換也是在調用程序前進行。第二個例子省略了$符號。因此,shell只是簡單地將字符串傳遞給echo作
    參數。在變量替換中,變量的值取代了變量名。例如在:

    $ls $LOOKUP/filename

    用/usr/mydir/filename做參數調用ls! 

    環境控制


    當login程序調用你的shell時,shell對你的環境進行設置,其中包括你的home(家)目錄,你使用的終端類型以及用來搜索可執行文件的
    路徑。環境被存儲在環境變量中。舉個例子,要改變終端類型,你需要改變TERM變量中的值,就象下面所示的:

    $echo $TERM

    vt 100

    $TERM=ansi

    $echo $TERM

    ansi



    注意在C-shell中,給環境變量賦值使用setenv命令。

    %setenv TERM
    vt100



    shell編程

     


    你已經看到shell可以用來解釋命令行,維護變量,執行程序。另外shell還是一種編程語言。通過使用流程控制和條件判斷來組合命令與變
    量賦值,你就擁有了一個有力的編程工具。使用shell作為一門編程語言,你可以使重復的任務自動化,寫報告,甚至你可以建立和操縱自
    己的數據文件。



    來源:
    http://www.linuxeden.com/edu/doctext.php?docid=1337

    論壇徽章:
    0
    8 [報告]
    發表于 2003-12-09 11:50 |只看該作者

    shell 十三問?

    單引號‘’
    取消除單引號以外的任何字符的特殊含義。如:echo  ‘my name is  $name’其結果為:my name is $name ,此時$只作為一個普通字符使用了。

    雙引號“”
    取消除雙引號、$號以及_號以外的所有字符的特殊含義

    論壇徽章:
    0
    9 [報告]
    發表于 2003-12-09 11:51 |只看該作者

    shell 十三問?

    輸入轉向符〈
    用于指定輸入的設備或文件。如:mail root〈message則將文件message 的內容發送給root。

    輸出轉向符 〉
    用于將輸出發送到指定的設備或文件。如:lf 〉myfile 其結果是將lf的執行結果放到文件myfile中(同時清空文件中原有的數據),而不顯示到屏幕上。

    論壇徽章:
    0
    10 [報告]
    發表于 2003-12-09 11:56 |只看該作者

    shell 十三問?

    && 和 ||
    其作用是使管道線有條件地執行。其使用方法為:
    command1 && command2:當且僅當command1執行成功后才執行command2
    command1 || command2:當且僅當command1執行失敗后才執行command2
    您需要登錄后才可以回帖 登錄 | 注冊

    本版積分規則 發表回復

      

    北京盛拓優訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年舉報專區
    中國互聯網協會會員  聯系我們:huangweiwei@itpub.net
    感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP
       日韩综合区视频第一页导航,无码JK粉嫩小泬在线观看,午夜精品A片一区二区三区,日日躁夜夜躁狠狠躁麻豆,大胆国模,免费观看无遮挡www的网站