Linux的shell編程

來源:互聯網
上載者:User

Shell本身是一個用C語言編寫的程式,它是使用者使用Linux的橋樑。Shell既是一種命令語言,又是一種程式設計語言。作為命令語言,它互動式地解釋和執行使用者輸入的命令;作為程式設計語言,它定義了各種變數和參數,並提供了許多在進階語言中才具有的控制結構,包括迴圈和分支。它雖然不是Linux系統核心的一部分,但它調用了系統核心的大部分功能來執行程式、建立檔案並以並行的方式協調各個程式的運行。因此,對於使用者來說,shell是最重要的公用程式,深入瞭解和熟練掌握shell的特性極其使用方法,是用好 Linux系統的關鍵。可以說,shell使用的熟練程度反映了使用者對Linux使用的熟練程度。

  一、什麼是shell

  當一個使用者登入Linux系統之後,系統初始化程式init就為每一個使用者運行一個稱為shell(外殼)的程式。那麼,shell是什麼呢?確切一點說,shell就是一個命令列解譯器,它為使用者提供了一個向Linux核心發送請求以便運行程式的介面系統級程式,使用者可以用shell來啟動、掛起、停止甚至是編寫一些程式。

  當使用者使用Linux時是通過命令來完成所需工作的。一個命令就是使用者和shell之間對話的一個基本單位,它是由多個字元組成並以換行結束的字串。shell解釋使用者輸入的命令,就象DOS裡的command.com所做的一樣,所不同的是,在DOS中,command.com只有一個,而在Linux下比較流行的shell有好幾個,每個shell都各有千秋。一般的Linux系統都將bash作為預設的shell。

  二、幾種流行的shell

  目前流行的shell有ash、bash、ksh、csh、zsh等,你可以用下面的命令來查看你自己的shell類型:

  #echo $SHELL

  $SHELL是一個環境變數,它記錄使用者所使用的shell類型。你可以用命令:

  #shell-name

  來轉換到別的shell,這裡shell-name是你想要嘗試使用的shell的名稱,如ash等。這個命令為使用者又啟動了一個shell,這個shell在最初登入的那個shell之後,稱為下級的shell或子shell。使用命令:

  $exit

  可以退出這個子shell。

  使用不同的shell的原因在於它們各自都有自己的特點,下面作一個簡單的介紹:

  1.ash

  ash shell是由Kenneth Almquist編寫的,Linux中佔用系統資源最少的一個小shell,它只包含24個內部命令,因而使用起來很不方便。

  2.bash

  bash是Linux系統預設使用的shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的縮寫,內部命令一共有40個。Linux使用它作為預設的shell是因為它有諸如以下的特色:

  (1)可以使用類似DOS下面的doskey的功能,用方向鍵查閱和快速輸入並修改命令。

  (2)自動通過尋找匹配的方式給出以某字串開頭的命令。

  (3)包含了自身的協助功能,你只要在提示符下面鍵入help就可以得到相關的協助。

  3.ksh

  ksh是Korn shell的縮寫,由Eric Gisin編寫,共有42條內部命令。該shell最大的優點是幾乎和商業發行版的ksh完全相容,這樣就可以在不用花錢購買商業版本的情況下嘗試商業版本的效能了。

  4.csh

  csh是Linux比較大的核心,它由以William Joy為代表的共計47位作者編成,共有52個內部命令。該shell其實是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh。

  5.zch

  zch是Linux最大的shell之一,由Paul Falstad完成,共有84個內部命令。如果只是一般的用途,是沒有必要安裝這樣的shell的。
3. shell程式設計(基礎部分)

  其實作為命令語言互動式地解釋和執行使用者輸入的命令只是shell功能的一個方面,shell還可以用來進行程式設計,它提供了定義變數和參數的手段以及豐富的程式控制結構。使用shell編程類似於DOS中的批次檔,稱為shell script,又叫shell程式或shell命令檔案。

  1.shell基本文法

  shell的基本文法主要就是如何輸入命令運行程式以及如何在程式之間通過shell的一些參數提供便利手段來進行通訊。

  (1)輸入輸出重新導向

  在Linux中,每一個進程都有三個特殊的檔案描述指標:標準輸入(standard input,檔案描述指標為0)、標準輸出(standard output,檔案描述指標為1)、標準錯誤輸出(standard error,檔案描述指標為2)。這三個特殊的檔案描述指標使進程在一般情況下接收標準輸入終端的輸入,同時由標準終端來顯示輸出,Linux同時也向使用者提供可以使用普通的檔案或管道來取代這些標準輸入輸出裝置。在shell中,使用者可以利用“>”和“<”來進行輸入輸出重新導向。如:

  command>file:將命令的輸出結果重新導向到一個檔案。

  command>&file:將命令的標準錯誤輸出一起重新導向到一個檔案。

  command>>file:將標準輸出的結果追加到檔案中。

  command>>&file:將標準輸出和標準錯誤輸出的結構都追加到檔案中。

  command< p>

  (2)管道pipe

  pipe同樣可以在標準輸入輸出和標準錯誤輸出間做代替工作,這樣一來,可以將某一個程式的輸出送到另一個程式的輸入,其文法如下:

  command1| command2[| command3...]

  也可以連同標準錯誤輸出一起送入管道:

  command1| &command2[|& command3...]

  (3)前台和後台

  在shell下面,一個新產生的進程可以通過用命令後面的符號“;”和“&”來分別以前台和背景方式來執行,文法如下:

  command

  產生一個前台的進程,下一個命令須等該命令運行結束後才能輸入。

  command &

  產生一個背景進程,此進程在後台啟動並執行同時,可以輸入其他的命令。

  2。shell程式的變數和參數

  像進階程式設計語言一樣,shell也提供說明和使用變數的功能。對shell來講,所有變數的取值都是一個字串,shell程式採用$var的形式來引用名為var的變數的值。

  Shell有以下幾種基本類型的變數:

  (1)shell定義的環境變數

  shell在開始執行時就已經定義了一些和系統的工作環境有關的變數,這些變數使用者還可以重新定義,常用的shell環境變數有:

  HOME:用於儲存註冊目錄的完全路徑名。

  PATH:用於儲存用冒號分隔的目錄路徑名,shell將按PATH變數中給出的順序搜尋這些目錄,找到的第一個與命令名稱一致的可執行檔將被執行。

  TERM:終端的類型。

  UID:目前使用者的標識符,取值是由數字構成的字串。

  PWD:當前工作目錄的絕對路徑名,該變數的取值隨cd命令的使用而變化。

  PS1:主提示符,在特權使用者下,預設的主提示符是“#”,在普通使用者下,預設的主提示符是“$”。

  PS2:在shell接收使用者輸入命令的過程中,如果使用者在輸入行的末尾輸入“”然後斷行符號,或者當使用者按斷行符號鍵時shell判斷出使用者輸入的命令沒有結束時,顯示這個輔助提示符,提示使用者繼續輸入命令的其餘部分,預設的輔助提示符是“>”。

  (2)使用者定義的變數

  使用者可以按照下面的文法規則定義自己的變數:

  變數名=變數值

  要注意的一點是,在定義變數時,變數名前不應加符號“$”,在引用變數的內容時則應在變數名前加“$”;在給變數賦值時,等號兩邊一定不能留空格,若變數中本身就包含了空格,則整個字串都要用雙引號括起來。

  在編寫shell程式時,為了使變數名和命令名相區別,建議所有的變數名都用大寫字母來表示。

  有時我們想要在說明一個變數並對它設定為一個特定值後就不在改變它的值,這可以用下面的命令來保證一個變數的唯讀性:

  readly 變數名

  在任何時候,建立的變數都只是當前shell的局部變數,所以不能被shell啟動並執行其他命令或shell程式所利用,export命令可以將一局部變數提供給shell執行的其他命令使用,其格式為:

  export 變數名

  也可以在給變數賦值的同時使用export命令:

  export 變數名=變數值

  使用export說明的變數,在shell以後啟動並執行所有命令或程式中都可以訪問到。

  (3)位置參數

  位置參數是一種在調用shell程式的命令列中按照各自的位置決定的變數,是在程式名之後輸入的參數。位置參數之間用空格分隔,shell取第一個位置參數替換程式檔案中的$1,第二個替換$2,依次類推。$0是一個特殊的變數,它的內容是當前這個shell程式的檔案名稱,所以,$0不是一個位置參數,在顯示當前所有的位置參數時是不包括$0的。

  (4)預定義變數

  預定義變數和環境變數相類似,也是在shell一開始時就定義了的變數,所不同的是,使用者只能根據shell的定義來使用這些變數,而不能重定義它。所有預定義變數都是由$符和另一個符號組成的,常用的shell預定義變數有:

  $#:位置參數的數量

  $*:所有位置參數的內容

  $?:命令執行後返回的狀態

  $$:當前進程的進程號

  $!:後台啟動並執行最後一個進程號

  $0:當前執行的進程名

  其中,“$?”用於檢查上一個命令執行是否正確(在Linux中,命令退出狀態為0表示該命令正確執行,任何非0值表示命令出錯)。

  “$$”變數最常見的用途是用作臨時檔案的名字以保證臨時檔案不會重複。

  (5)參數置換的變數

  shell提供了參數置換能力以便使用者可以根據不同的條件來給變數賦不同的值。參數置換的

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.