歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix基礎知識 >> Unix Shell程序編寫方法詳解

Unix Shell程序編寫方法詳解

日期:2017/3/3 15:25:32   编辑:Unix基礎知識

Shell是什麼?

任何發明都具有供用戶使用的界面。UNIX供用戶使用的界面就是Shell(DOS的command熟悉吧,但UNIX的要強大的多)。

Shell為用戶提供了輸入命令和參數並可得到命令執行結果的環境。

為了不同的需要,UNIX提供了不同的Shell。現在的UNIX大部分都支持BourneShell,以下教程就以BourneShell(Bsh)為例,一步步的領略UNIX Shell的強大功能,占先其強大魅力,達到更方便靈活的管理、應用UNIX的目的。

1.UNIX內核和Shell的交互方法

啟動UNIX時,程序UNIX(內核)將被調入計算機內存,並一直保留在內存中直到機器關閉。在引導過程中,程序init將進入後台運行一直到機器關閉。該程序查詢文件/etc/inittab,該文件列出了連接終端的各個端口及其特征。當發現一個活動的終端時,init程序調用getty程序在終端上顯示login等登陸信息。(username和passwd),在輸入密碼後,getty調用login進程,該進程根據文件/etc/passwd的內容來驗證用戶的身份。若用戶通過身份驗證,login進程把用戶的home目錄設置成當前目錄並把控制交給一系列setup程序。setup程序可以是指定的應用程序,通常setup程序為一個Shell程序,如:/bin/sh 即Bourne Shell(command出來了,呵呵)。

得到控制後,Shell程序讀取並執行文件/etc/.profile以及.profile。這兩個文件分別建立了系統范圍內的和該用戶自己的工作環境。最後Shell顯示命令提示符,如$。(這是以bsh為例,若是csh,為.cshrc,ksh為.kshrc,bash為.bashrc等等) 注不妨把/etc/.profile和.profile看成DOS的autoexec.bat 或config.sys文件)

當shell退出時,內核把控制交給init程序,該程序重新啟動自動登陸過程。有兩種方法使shell退出,一是用戶執行exit命令,二是內核(例如root用kill命令)發出一個kill命令結束shell進程。shell退出後,內核回收用戶及程序使用的資源。

用戶登陸後,用戶命令同計算機交互的關系為:命令進程--->Shell程序--->UNIX內核--->計算機硬件。當用戶輸入一個命令,如$ls,

Shell將定位其可執行文件/bin/ls並把其傳遞給內核執行。內核產生一個新的子進程調用並執行/bin/ls。當程序執行完畢後,內核取消

該子進程並把控制交給其父進程,即Shell程序。例如執行:

$ps

該命令將會列出用戶正在執行的進程,即Shell程序(下來詳細說說,別急現在)和ps程序。若執行:

$sleep 10 & $ps

其中第一條命令將產生一個在後台執行的sleep子進程。ps命令執行時會顯示出該子進程。

每當用戶執行一條命令時,就會產生一個子進程。該子進程的執行與其父進程或Shell完全無關,這樣可以使Shell去做其他工作。(Shell只是把用戶的意圖告訴內核,然後該干嘛干嘛) 現在windows有個計劃任務(在固定的時間,日期自動執行某任務),其實UNIX很早就有這個功能了,也就是所謂的Shell的自動執行。一些UNIX資源,如cron可以自動執行Shell程序而無需用戶的參與,(這個功能好象在/var/spool/crotab目錄裡)。

Crontab 程序對於系統管理員來說是非常有用的。Cron服務用於計劃程序在特定時間(月、日、周、時、分)運行。我們以root的crontab 為例。根用戶的crontab 文件放在 /var/spool/crontab/root 中,其格式如下:

(1)  (2)  (3)  (4)  (5)  (6)

0   0   *   *   3   /usr/bin/updatedb

1. 分鐘 (0-60)

2. 小時 (0-23)

3. 日 (1-31)

4. 月 (1-12)

5. 星期 (1-7)

6. 所要運行的程序

2.Shell的功能和特點

1>命令行解釋

2>使用保留字

3>使用Shell元字符(通配符)

4>可處理程序命令

5>使用輸入輸出重定向和管道

6>維護一些變量

7>運行環境控制

8>支持Shell編程

對於"命令行解釋"就不多說了,就是在shell提示符(例如:"$","%","#"等)後輸入一行unix命令,Shell將接收用戶的輸入。

"使用保留字":Shell有一些具有特殊意義的字,例如在Shell腳本中,do,done,for等字用來控制循環操作,if,then等控制條件操作。保留字隨Shell環境的不同而不同。

"通配符":* 匹配任何位置

? 匹配單個字符

[] 匹配的字符范圍或列表 例如:

$ls [a-c]*

將列出以a-c范圍內字符開頭的所有文件

$ls [a,m,t]*

將列出以e,m或t開頭的所有文件

"程序命令" :當用戶輸入命令後,Shell讀取環境變量$path(一般在用戶自己的.profile中設置),該變量包含了命令可執行文件可能存在的目錄列表。

shell從這些目錄中尋找命令所對應的可執行文件,然後將該文件送給內核執行。

"輸入輸出重定向及管道" :重定向的功能同DOS的重定向功能:

">" 重定向輸出

"<" 重定向輸入

而管道符號,是unix功能強大的一個地方,符號是一條豎線:"|",用法:

command 1 | command 2 他的功能是把第一個命令command 1執行的結果作為command 2的輸入傳給command 2,例如:

$ls -s|sort -nr|pg

該命令列出當前目錄中的所有文件,並把輸出送給sort命令作為輸入,sort命令按數字遞減的順序把ls的輸出排序。然後把排序後的內容傳送給pg命令,pg命令在顯示器上顯示sort命令排序後的內容。

"維護變量" :Shell可以維護一些變量。變量中存放一些數據供以後使用。用戶可以用"="給變量賦值,如: $lookup=/usr/mydir

該命令建立一個名為lookup的變量並給其賦值/usr/mydir,以後用戶可以在命令行中使用lookup來代替/usr/mydir,例如:

$echo $lookup

結果顯示:/usr/mydir

為了使變量能被子進程使用,可用exprot命令,例如:

$lookup=/usr/mydir

$export lookup

"運行環境控制" :當用戶登陸啟動shell後,shell要為用戶創建一個工作的環境,如下:

1>當login程序激活用戶shell後,將為用戶建立環境變量。從/etc/profile和.profile文件中讀出,在這些文件中一般都用$TERM

變量設置終端類型,用$PATH變量設置Shell尋找可執行文件的路徑。

2>從/etc/passwd文件或命令行啟動shell時,用戶可以給shell程序指定一些參數,例如"-x",可以在命令執行前顯示該命令及其參數。後面詳細介紹這些參數。

"shell編程" :本文主要介紹的內容。

shell本身也是一種語言(*可以先理解為unix命令的組合,加上類C的條件,循環等程序控制語句,類似dos批處理,但要強大的多),用戶可以

通過shell編程(腳本,文本文件),完成特定的工作。

SHELL變量

下面我們詳細的介紹Bourne Shell的編程:

自從貝爾實驗室設計了Bourne

Shell。從那時起許多廠商根據不同的硬件平台設計了許多版本得unix。但在眾多版本的unix中,Bourne Shell

一直保持一致。

1>Bsh的啟動:用戶在登陸後,系統根據文件/etc/passwd中有關該用戶的信息項啟動Shell。例如某用戶在passwd中的信息項為:

ice_walk:!:411:103:Imsnow ,ice_walk:/home/ice_walk:/bin/bsh

則表明,用戶名是ice_walk等信息,在最後一項"/bin/bsh"表明用戶的sh環境類型是bsh,於是系統啟動之。在啟動或執行(包括下面我們要講

的shell程序--腳本)過程中可以使用以下一些參數,我們一一說明:

-a 將所有變量輸出

-c "string"從string中讀取命令

-e 使用非交互式模式

-f 禁止shell文件名產生

-h 定義

-i 交互式模式

-k 為命令的執行設置選項

-n 讀取命令但不執行

-r 受限模式

-s 命令從標准輸入讀取

-t 執行一命令,然後退出shell

-u 在替換時,使用未設置的變量將會出錯

-v 顯示shell的輸入行

-x 跟蹤模式,顯示執行的命令

許多模式可以組合起來用,您可以試試了,但-ei好象不行,你說why呢?

使用set可以設置或取消shell的選項來改變shell環境。打開選項用"-",關閉選項用"+",多數unix允許打開或關閉a、f、e、h、k、n、u

v和x選項。若顯示Shell中已經設置的選項,執行:

$echo $-Bsh中每個用戶的home目錄下都有一個.profile文件,可以修改該文件來修改shell環境。為了增加一個可執行文件的路徑(例如/ice_walk/bin),可以把下面代碼加入.profile中PATH=$PATH:/ice_walk/bin;exprot PATH.profile中shell的環境變量意思如下:

CDPATH 執行cd命令時使用的搜索路徑

HOME 用戶的home目錄 [更多精采技術文章-★編程入門★網]

IFS 內部的域分割符,一般為空格符、制表符、或換行符

MAIL 指定特定文件(信箱)的路徑,有UNIX郵件系統使用

PATH 尋找命令的搜索路徑(同dos的config.sys的 path)

PS1 主命令提示符,默認是"$"

PS2 從命令提示符,默認是">"

TERM 使用終端類型

2>Bsh裡特殊字符及其含義

在Bsh中有一組非字母字符。這些字符的用途分為四類:作為特殊變量名、產生文件名、數據或程序控制以及引用和逃逸字符控制。他們可以讓用戶在Shell中使用最少的代碼完成復雜的任務。

*> Shell變量名使用的特殊字符

$# 傳送給命令Shell的參數序號

$- 在Shell啟動或使用set命令時提供選項

$? 上一條命令執行後返回的值

$$ 當前shell的進程號

$! 上一個子進程的進程號

$@ 所有的參數,每個都用雙括號括起

$* 所有參數,用雙括號括起

$n 位置參數值,n表示位置

$0 當前shell名

*>產生文件名的特殊字符包括"*","?","[]",上面講過,不再多說。

*>數據或程序控制使用的特殊字符

>(file) 輸出重定向到文件中(沒有文件則創建,有則覆蓋)

>>(file) 輸出重定向到文件中(沒有則創建,有則追加到文件尾部)

<(file) 輸入重定向到文件 ; 命令分割符| 管道符 & 後台運行(例如:sleep 10 &) ` ` 命令替換,重定向一條命令的輸出作為另一命令的參數。

*>對於引用或逃逸的特殊字符

Bsh用單引號' '和雙引號" "將特殊字符或由空白分隔的字引用起來組成一個?

Copyright © Linux教程網 All Rights Reserved