linux程式設計——shell程式設計(第二章)

來源:互聯網
上載者:User

標籤:

第二章    shell程式設計

本章介紹以下內容:
什麼是shell
基本思路
微妙的文法:變數,條件判斷和程式控制
命令列表
函數
命令和命令的執行
here文檔
調試
grep命令和Regex
find命令

shell執行shell程式,這些程式通常稱為指令碼,它們是在運行時解釋執行的。這使得調試工作比較容易進行,因為可以逐行地執行指令,而且節省了重新編譯的時間。然而,這也使得 shell不適合用來完成時間緊迫型和處理器忙碌型的任務。
UNIX架構非常依賴於代碼的高度可重用性,如果你編寫了一個小巧而簡單的工具,其他人就可以將它作為一根鏈條上的某個環節來構成一條命令。
什麼是shell
shell是一個作為使用者與linux系統間介面的程式,它允許使用者向作業系統輸入需要執行的命令。這點與windows的命令提示字元類似,但是Linxu shell的功能更強大。
shell(bash和csh)以及X視窗系統和其他程式環繞在linux核心的周圍。在linux系統中,總是作為/bin/sh安裝的標準shell是GNU工具集中的bash。在大多數linux發行版中,預設的shell程式/bin/sh實際上是對程式/bin/bash的一個串連。
可以使用/bin/bash --version查看bash的版本號碼
2.4管道和重新導向
介紹如何對linxu程式的輸入輸出進行重新導向
重新導向輸出:
$ ls -1 > lsoutput.txt
這條命令 把ls命令的輸出儲存到檔案lsoutput.txt中。
檔案描述符0代表一個程式的標準輸入,檔案描述符1代表一個程式的標準輸出,檔案描述符2代表標準錯誤輸出
>操作符把標準輸出重新導向到一個檔案。在預設情況下,如果該檔案已經存在,它的內容將被 覆蓋
>>操作符將輸出內容 附加到一個檔案中。例如:
$ ps >> lsoutput.txt
這條命令會將ps命令的輸出附加到特定檔案的尾部。
如果想對標準錯誤輸出進行重新導向,需要把重新導向的檔案描述符編號載入>操作符的前面。因為標準錯誤輸出的檔案描述符是2,所以使用2>操作符。當需要丟掉錯誤資訊並阻止它顯示在螢幕上時,這個方法很有用。
管道
可以用管道操作符|來串連進程,linux與MS-DOS不同,在linux下通過管道串連的進程可以同時運行,並且隨著資料流在它們之間的傳遞可以自動地進行協調。例如,可以使用sort命令對ps命令的輸出進行排序。
如果不使用管道,則必須分幾個步驟來完成這個任務,如下所示:
$ ps > psout.txt
$ sort psout.txt > pssort.out
一個更精巧的解決方案是 用管道來串連進程,如下所示:
$ ps | sort > pssort.out
作為程式設計語言的shell
編寫shell指令碼程式有兩種方式,可以輸入一系列命令讓shell互動執行它們,也可以把這些命令儲存到一個檔案中,然後將這個檔案作為程式來調用。
互動式程式
在命令列上直接輸入shell指令碼是一種測試短小程式碼片段的簡單而快捷的方式。
假如想要從大量C語言源檔案中尋找包含字串POSIX的檔案。與其使用grep命令在每個檔案中搜尋字串,然後再分別列出包含該字串的檔案,不如用下面互動式指令碼來執行整個操作:
$ for file in *
> do
> if grep -1 POSIX $file
> then
> more $file
> fi
> done
在這個例子中,grep命令輸出它找到的包含POSIX字串的檔案,然後more命令將檔案的內容顯示在螢幕上,最後,返回shell提示符。shell還提供了萬用字元擴充,萬用字元×來匹配一個字串,萬用字元?來匹配單個字元,而 [set]允許匹配方括弧中任何一個單個字元,[^set]對方括弧中的內容取反,即匹配除給定字元集中字元以外的字元。擴充的花括弧 {}允許將任意的字串組放在一個集合中。例如
$ ls my_{finger, toe}s
這個命令將列出檔案my_fingers和my_toes,它使用shell來檢查目前的目錄下的每個檔案。
有經驗的linux使用者可能使用另一種更有效方式來執行這個簡單的操作。使用命令:
$ more  ‘grep -l POSIX *‘
或者是命令:
$ more $(grep -l POSIX *)
此外,下面的命令將輸出包含POSIX字串的檔案名稱:
$ grep -1 POSIX* | more
上面的指令碼中,shell利用其他命令(如grep和more)來完成主要的工作。shell本身只是允許將幾個現有的命令結合在一起,構成一個新的功能強大的命令。
如果每次想要執行一系列命令時,都要經過這麼一個過程,非常麻煩。因此只需要將這些命令儲存在一個檔案中,即我們常說的shell指令碼,這樣就可以隨時執行。
建立指令碼
使用vim建立一個包含命令的檔案,將其命名為first。
程式中的 注釋以#符號開始,一直持續到該行的結束。第一行#!/bin/sh,它是一種特殊的注釋, #!字元告訴系統同一行上緊跟在它後面的那個參數是用來執行本檔案的程式。/bin/sh是預設的shell程式。
exit命令的作用是確保指令碼程式能夠返回一個有意義的退出碼。當程式以互動方式運行時,很少需要檢查它的退出碼,但是從另一個指令碼程式裡調用這個指令碼程式並查看它是否執行成功,那麼返回一個適當的退出碼是必要的。
shell程式設計裡,0表示成功
一般情況下,Linux和UNIX很少使用檔案擴張名來決定檔案的類型。大多數預先安裝的指令碼程式並沒有使用任何檔案擴張名,檢查這些檔案是否是指令碼程式的最好方法是使用file命令,例如file first或者file /bin/bash。
運行指令檔有兩種方法,比較簡單的方法是調用shell,並把指令檔名當成一個參數,如下所示:
$ /bin/sh first
這可以工作,但如果能像對待其他Linxu命令那樣,只輸入指令碼程式的名字就可以調用它就更好了。你可以使用 chmod命令來改變這個檔案的模式,使得這個檔案可以被所有使用者執行,如下所示:
$ chmod +x first
然後可以用下面的命令來執行它:
$ first
你可能會看到一條錯誤資訊來告訴你未找到命令。這種情況很可能發生,因為shell環境變數PATH並沒有被設定為在目前的目錄下尋找要執行的命令。一種方法是在命令列上直接輸入命令PATH=$PATH:.,然後退出登陸後再重新登陸進來。另外,也可以在儲存指令碼程式的目錄中輸入 命令./first,該命令的作用是把指令碼程式的完整的相對路徑告訴shell。
用./來指定路徑還有另一個好處,它能夠保證不會意外執行系統中與你的指令檔同名的另一個命令。

linux程式設計——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.