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

2021-07-03 00:20:23 字數 3571 閱讀 3588

第二章    shell程式設計

本章介紹以下內容:

什麼是shell

基本思路

微妙的語法:變數,條件判斷和程式控制

命令列表

函式命令和命令的執行

here文件

除錯grep命令和正規表示式

find命令

shell執行shell程式,這些程式通常稱為指令碼,它們是在執行時解釋執行的。這使得除錯工作比較容易進行,因為可以逐行地執行指令,而且節省了重新編譯的時間。然而,這也使得shell不適合用來完成時間緊迫型和處理器忙碌型的任務。

unix架構非常依賴於**的高度可重用性,如果你編寫了乙個小巧而簡單的工具,其他人就可以將它作為一根鏈條上的某個環節來構成一條命令。

什麼是shell

shell是乙個作為使用者與linux系統間介面的程式,它允許使用者向作業系統輸入需要執行的命令。這點與windows的命令提示符類似,但是linux 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

2.5作為程式語言的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_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。

$ /bin/sh first

這可以工作,但如果能像對待其他linxu命令那樣,只輸入指令碼程式的名字就可以呼叫它就更好了。你可以使用chmod命令來改變這個檔案的模式,使得這個檔案可以被所有使用者執行,如下所示:

$ chmod +x first

然後可以用下面的命令來執行它:

$ first

你可能會看到一條錯誤資訊來告訴你未找到命令。這種情況很可能發生,因為shell環境變數path並沒有被設定為在當前目錄下查詢要執行的命令。一種方法是在命令列上直接輸入命令path=$path:.,然後退出登陸後再重新登陸進來。另外,也可以在儲存指令碼程式的目錄中輸入命令./first,該命令的作用是把指令碼程式的完整的相對路徑告訴shell。

用./來指定路徑還有另乙個好處,它能夠保證不會意外執行系統中與你的指令碼檔案同名的另乙個命令。

Linux程式設計 二 shell程式設計

shell有很多種,linux中常用的是 bin bash,可以通過 bin bash version檢視版本資訊 管道和重定向 重定向輸出 把ls命令的輸出儲存到檔案中 ls l lsoutput.txt 將輸出內容附加到乙個檔案中 ps lsoutput.txt 重定向輸入 意義不大 管道 程式...

shell程式設計 linux

shell 指令碼程式的編寫步驟如下 1 用編輯器 如 vi 編輯包含所有操作的 sh檔案 2 修改檔案的許可權為可讀可執行 3 執行當前 shell 程式 注意 1 指令碼檔案中 注釋行有 開始 2 指令碼一般第一行為 bin sh 可以在執行別的型別的指令碼的時候直接執行這種型別的指令碼 3 執...

shell程式設計(Linux)

c語言 編譯型,main.c main.exe,執行效率高,開發效率低。shell程式設計 解釋型main.sh通過需要通過乙個直譯器,解釋執行main.sh執行效率高開發效率低。python 解釋型語言。指令碼其實是傳給直譯器的引數,指令碼主要用在系統維護上。shell的基本語法 1.變數 1 本...