日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

shell程序編寫(xiě)從入門(mén)到精通(上)

 todaytomo 2006-12-28
*Shell是什么?
  任何發(fā)明都具有供用戶使用的界面。UNIX供用戶使用的界面就是Shell(DOS的command熟悉吧,但UNIX的要強(qiáng)大的多)。 Shell為用戶提供了輸入命令和參數(shù)并可得到命令執(zhí)行結(jié)果的環(huán)境。
  
  為了不同的需要,UNIX提供了不同的Shell。現(xiàn)在的UNIX大部分都支持BourneShell,以下教程就以BourneShell(Bsh)為例,一步步的領(lǐng)略UNIX Shell的強(qiáng)大功能,占先其強(qiáng)大魅力,達(dá)到更方便靈活的管理、應(yīng)用UNIX的目的。
  
  1.UNIX內(nèi)核和Shell的交互方法
  
  啟動(dòng)UNIX時(shí),程序UNIX(內(nèi)核)將被調(diào)入計(jì)算機(jī)內(nèi)存,并一直保留在內(nèi)存中直到機(jī)器關(guān)閉。在引導(dǎo)過(guò)程中,程序 init將進(jìn)入后臺(tái)運(yùn)行一直到機(jī)器關(guān)閉。該程序查詢(xún)文件/etc/inittab,該文件列出了連接終端的各個(gè)端口及其特征。當(dāng)發(fā)現(xiàn)一個(gè)活動(dòng)的終端時(shí),init程序調(diào)用getty程序在終端上顯示login等登陸信息。(username和passwd),在輸入密碼后, getty調(diào)用login進(jìn)程,該進(jìn)程根據(jù)文件/etc/passwd的內(nèi)容來(lái)驗(yàn)證用戶的身份。若用戶通過(guò)身份驗(yàn)證,login進(jìn)程 把用戶的home目錄設(shè)置成當(dāng)前目錄并把控制交給一系列setup程序。setup程序可以是指定的應(yīng)用程序,通常setup程序 為一個(gè)Shell程序,如:/bin/sh 即Bourne Shell(command出來(lái)了,呵呵)。
  
  得到控制后,Shell程序讀取并執(zhí)行文件/etc/.profile以及.profile。這兩個(gè)文件分別建立了系統(tǒng)范圍內(nèi)的和 該用戶自己的工作環(huán)境。最后Shell顯示命令提示符,如$。(這是以bsh為例,若是csh,為.cshrc,ksh為.kshrc,bash為.bashrc等等)
  
  注:(不妨把/etc/.profile和.profile看成DOS的autoexec.bat 或 config.sys文件)
  
  當(dāng)shell退出時(shí),內(nèi)核把控制交給init程序,該程序重新啟動(dòng)自動(dòng)登陸過(guò)程。有兩種方法使shell退出,一是用戶執(zhí)行exit命令,二是 內(nèi)核(例如root用kill命令)發(fā)出一個(gè)kill命令結(jié)束shell進(jìn)程。shell退出后,內(nèi)核回收用戶及程序使用的資源。
  
  用戶登陸后,用戶命令同計(jì)算機(jī)交互的關(guān)系為:命令進(jìn)程--->Shell程序--->UNIX內(nèi)核--->計(jì)算機(jī)硬件。當(dāng)用戶輸入一個(gè)命令,如$ls, Shell將定位其可執(zhí)行文件/bin/ls并把其傳遞給內(nèi)核執(zhí)行。內(nèi)核產(chǎn)生一個(gè)新的子進(jìn)程調(diào)用并執(zhí)行/bin/ls。當(dāng)程序執(zhí)行完畢后,內(nèi)核取消 該子進(jìn)程并把控制交給其父進(jìn)程,即Shell程序。例如執(zhí)行:
  
  $ps
  
  該命令將會(huì)列出用戶正在執(zhí)行的進(jìn)程,即Shell程序(下來(lái)詳細(xì)說(shuō)說(shuō),別急現(xiàn)在)和ps程序。若執(zhí)行:
  
  $sleep 10 &
  $ps
  
  其中第一條命令將產(chǎn)生一個(gè)在后臺(tái)執(zhí)行的sleep子進(jìn)程。ps命令執(zhí)行時(shí)會(huì)顯示出該子進(jìn)程。
  
  每當(dāng)用戶執(zhí)行一條命令時(shí),就會(huì)產(chǎn)生一個(gè)子進(jìn)程。該子進(jìn)程的執(zhí)行與其父進(jìn)程或Shell完全無(wú)關(guān),這樣可以使Shell去做其他工作。(Shell只是把用戶的意圖告訴內(nèi)核,然后該干嘛干嘛:)) 現(xiàn)在windows有個(gè)計(jì)劃任務(wù)(在固定的時(shí)間,日期自動(dòng)執(zhí)行某任務(wù)),其實(shí)UNIX很早就有這個(gè)功能了,也就是所謂的Shell的自動(dòng)執(zhí)行。一些UNIX 資源,如cron可以自動(dòng)執(zhí)行Shell程序而無(wú)需用戶的參與,(這個(gè)功能好象在/var/spool/crotab目錄里)。
  
  Crontab 程序?qū)τ谙到y(tǒng)管理員來(lái)說(shuō)是非常有用的。Cron 服務(wù)用于計(jì)劃程序在特定時(shí)間(月、日、周、時(shí)、分)運(yùn)行。我們以root的crontab 為例。根用戶的 crontab 文件放在 /var/spool/crontab/root 中,其格式如下:
  
  (1)  (2)  (3)  (4)  (5)  (6)
  0   0   *   *   3   /usr/bin/updatedb
  1. 分鐘 (0-60)
  2. 小時(shí) (0-23)
  3. 日 (1-31)
  4. 月 (1-12)
  5. 星期 (1-7)
  6. 所要運(yùn)行的程序

2.Shell的功能和特點(diǎn)
  1>命令行解釋
  2>使用保留字
  3>使用Shell元字符(通配符)
  4>可處理程序命令
  5>使用輸入輸出重定向和管道
  6>維護(hù)一些變量
  7>運(yùn)行環(huán)境控制
  8>支持Shell編程
  
  對(duì)于"命令行解釋"就不多說(shuō)了,就是在shell提示符(例如:"$","%","#"等)后輸入一行unix命令,Shell將接收用戶的輸入。
  
  "使用保留字":Shell有一些具有特殊意義的字,例如在Shell腳本中,do,done,for等字用來(lái)控制循環(huán)操作,if,then等控制條件操作。 保留字隨Shell環(huán)境的不同而不同。
  
  "通配符":* 匹配任何位置
   匹配單個(gè)字符
  [] 匹配的字符范圍或列表 例如:
  
  $ls [a-c]*
  
  將列出以a-c范圍內(nèi)字符開(kāi)頭的所有文件
  $ls [a,m,t]*
  將列出以e,m或t開(kāi)頭的所有文件
  
  "程序命令" :當(dāng)用戶輸入命令后,Shell讀取環(huán)境變量$path(一般在用戶自己的.profile中設(shè)置),該變量包含了命令可執(zhí)行文件可能存在的目錄列表。 shell從這些目錄中尋找命令所對(duì)應(yīng)的可執(zhí)行文件,然后將該文件送給內(nèi)核執(zhí)行。
  
  "輸入輸出重定向及管道" :重定向的功能同DOS的重定向功能:
  
  ">" 重定向輸出
  "<" 重定向輸入
  
  而管道符號(hào),是unix功能強(qiáng)大的一個(gè)地方,符號(hào)是一條豎線:"|",用法: command 1 | command 2 他的功能是把第一個(gè)命令command 1執(zhí)行的結(jié)果作為command 2的輸入傳給command 2,例如:
  
  $ls -s|sort -nr|pg
  
  該命令列出當(dāng)前目錄中的所有文件,并把輸出送給sort命令作為輸入,sort命令按數(shù)字遞減的順序把ls的輸出排序。然后把排序后的 內(nèi)容傳送給pg命令,pg命令在顯示器上顯示sort命令排序后的內(nèi)容。
  
  "維護(hù)變量" :Shell可以維護(hù)一些變量。變量中存放一些數(shù)據(jù)供以后使用。用戶可以用"="給變量賦值,如:
  
  $lookup=/usr/mydir
  
  該命令建立一個(gè)名為lookup的變量并給其賦值/usr/mydir,以后用戶可以在命令行中使用lookup來(lái)代替/usr/mydir,例如:
  $echo $lookup
  結(jié)果顯示:/usr/mydir
  
  為了使變量能被子進(jìn)程使用,可用exprot命令,例如:
  
  $lookup=/usr/mydir
  $export lookup
  
  "運(yùn)行環(huán)境控制" :當(dāng)用戶登陸啟動(dòng)shell后,shell要為用戶創(chuàng)建一個(gè)工作的環(huán)境,如下:
  
  1>當(dāng)login程序激活用戶shell后,將為用戶建立環(huán)境變量。從/etc/profile和.profile文件中讀出,在這些文件中一般都用$TERM 變量設(shè)置終端類(lèi)型,用$PATH變量設(shè)置Shell尋找可執(zhí)行文件的路徑。
  
  2>從/etc/passwd文件或命令行啟動(dòng)shell時(shí),用戶可以給shell程序指定一些參數(shù),例如"-x",可以在命令執(zhí)行前顯示該命令及其參數(shù)。后面詳細(xì)介紹這些參數(shù)。
  
  "shell編程" :本文主要介紹的內(nèi)容。
  
  shell本身也是一種語(yǔ)言(*可以先理解為unix命令的組合,加上類(lèi)C的條件,循環(huán)等程序控制語(yǔ)句,類(lèi)似dos批處理,但要強(qiáng)大的多),用戶可以 通過(guò)shell編程(腳本,文本文件),完成特定的工作。
  
  SHELL變量
  
  下面我們?cè)敿?xì)的介紹Bourne Shell的編程:
  
  自從貝爾實(shí)驗(yàn)室設(shè)計(jì)了Bourne Shell。從那時(shí)起許多廠商根據(jù)不同的硬件平臺(tái)設(shè)計(jì)了許多版本得unix。但在眾多版本的unix中,Bourne Shell 一直保持一致。
  1>Bsh的啟動(dòng):用戶在登陸后,系統(tǒng)根據(jù)文件/etc/passwd中有關(guān)該用戶的信息項(xiàng)啟動(dòng)Shell。例如某用戶在passwd中 的信息項(xiàng)為:
  
  ice_walk:!:411:103:Imsnow ,ice_walk:/home/ice_walk:/bin/bsh
  
  則表明,用戶名是ice_walk等信息,在最后一項(xiàng)"/bin/bsh"表明用戶的sh環(huán)境類(lèi)型是bsh,于是系統(tǒng)啟動(dòng)之。在啟動(dòng)或執(zhí)行(包括下面我們要講 的shell程序--腳本)過(guò)程中可以使用以下一些參數(shù),我們一一說(shuō)明:
  
  -a 將所有變量輸出
  -c "string"從string中讀取命令
  -e 使用非交互式模式
  -f 禁止shell文件名產(chǎn)生
  -h 定義
  -i 交互式模式
  -k 為命令的執(zhí)行設(shè)置選項(xiàng)
  -n 讀取命令但不執(zhí)行
  -r 受限模式
  -s 命令從標(biāo)準(zhǔn)輸入讀取
  -t 執(zhí)行一命令,然后退出shell
  -u 在替換時(shí),使用未設(shè)置的變量將會(huì)出錯(cuò)
  -v 顯示shell的輸入行
  -x 跟蹤模式,顯示執(zhí)行的命令
  
  許多模式可以組合起來(lái)用,您可以試試了,但-ei好象不行,你說(shuō)why呢?
  
  使用set可以設(shè)置或取消shell的選項(xiàng)來(lái)改變shell環(huán)境。打開(kāi)選項(xiàng)用"-",關(guān)閉選項(xiàng)用"+",多數(shù)unix允許打開(kāi)或關(guān)閉a、f、e、h、k、n、 u、v和x選項(xiàng)。若顯示Shell中已經(jīng)設(shè)置的選項(xiàng),執(zhí)行:
  
  $echo $-
  
  Bsh中每個(gè)用戶的home目錄下都有一個(gè).profile文件,可以修改該文件來(lái)修改shell環(huán)境。為了增加一個(gè)可執(zhí)行文件的路徑(例如/ice_walk/bin), 可以把下面代碼加入.profile中
  
  PATH=$PATH:/ice_walk/bin;exprot PATH
  
  .profile中shell的環(huán)境變量意思如下:
  
  CDPATH 執(zhí)行cd命令時(shí)使用的搜索路徑
  HOME 用戶的home目錄
  IFS 內(nèi)部的域分割符,一般為空格符、制表符、或換行符
  MAIL 指定特定文件(信箱)的路徑,有UNIX郵件系統(tǒng)使用
  PATH 尋找命令的搜索路徑(同dos的config.sys的 path)
  PS1 主命令提示符,默認(rèn)是"$"
  PS2 從命令提示符,默認(rèn)是">"
  TERM 使用終端類(lèi)型
  
  2>Bsh里特殊字符及其含義
  
  在Bsh中有一組非字母字符。這些字符的用途分為四類(lèi):作為特殊變量名、產(chǎn)生文件名、數(shù)據(jù)或程序控制以及引用和逃逸字符控制。他們 可以讓用戶在Shell中使用最少的代碼完成復(fù)雜的任務(wù)。
  
  *> Shell變量名使用的特殊字符
       $0這個(gè)程序的執(zhí)行名字
       $n這個(gè)程序的第n個(gè)參數(shù)值, n=1...9
       $*這個(gè)程序的所有參數(shù)
  $# 傳送給命令Shell的參數(shù)個(gè)數(shù)
  $- 在Shell啟動(dòng)或使用set命令時(shí)提供選項(xiàng)
  $? 上一條命令執(zhí)行后返回的值
  $$ 當(dāng)前shell的進(jìn)程號(hào)
  $! 上一個(gè)子進(jìn)程的進(jìn)程號(hào)
  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多