版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1Unix/Linux編程2第九章第九章 可編程的可編程的shell 、shell變量和環(huán)境變量和環(huán)境:編編 寫自己的寫自己的shell3概念與技巧概念與技巧:lUnix shell是一種編程語言l什么是shell腳本語言?shell如何處理腳本語言?lshell如何處理結(jié)構(gòu)化的工作?exit(0)=successl為什么需要shell變量以及如何使用shell變量l什么是環(huán)境?它是如何工作的?相關(guān)系統(tǒng)調(diào)用:相關(guān)系統(tǒng)調(diào)用:lexitlgetenv相關(guān)命令:相關(guān)命令:lenv4l 9.1 shell編程l 9.2 什么是以及為什么要使用shell腳本語言l 9.3 smsh1-命令行解析l 9.
2、4 shell的流程控制l 9.5 shell變量:局部和全局l 9.6 環(huán)境:個性化設置l 9.7 已實現(xiàn)的shell的功能主要內(nèi)容:5 Shell程序,一般稱之為設shell腳本,是Unix的重要組成部分,Unix的引導程序和很多管理程序都使用shell腳本。Shell是一個編程語言解釋器,這個解釋器解釋從鍵盤輸入的命令,也解釋存儲在腳本中的命令序列.shell腳本是一個包含一系列命令的文件,運行一個腳本就是運行這個文件中的每個命令.9.1 9.1 shell編程編程9.2 9.2 什么是以及問什么要使用什么是以及問什么要使用shell腳本語言腳本語言6 Sh的編程特征:的編程特征:變量、
3、I/O和if.then 腳本中除了命令之外還包括以下元素: 1 變量 腳本中可以定義變量,在script2中,定義了名為 BOOK和NAME兩個變量 2 用戶輸入 read命令告訴shell要從標準輸入中讀入一個 字符串 3 控制 這個腳本中包括if.then.else.if控制語句,另外還 有while、case和for 4 環(huán)境 腳本使用一個名為HOME的變量.HOME的值是你 主目錄的路徑79.3 smsh1-命令行解析命令行解析 shell的主函數(shù)的主函數(shù):int main() char *cmdline,*prompt,*arglist; int result; void setup
4、(); prompt=DEL_PROMPT; setup(); while(cmdline=next_cmd(propmt,stdin)!=NULL) if(arglist=splitline(cmdline)!=NULL) result=execute(arglist); freelist(arglist); free(cmdline); return 0; 一個有信號一個有信號,通出和解析的通出和解析的shell從輸入流中讀入一個命令將一個字符串分解為字符串數(shù)組,并返回這個數(shù)組使用fork、execvp、wait來運行一個命令9.3 9.3 smsh1命令行解析命令行解析89.4.1 if
5、語句做些什么語句做些什么? 答案答案:條件檢測條件檢測 程序如何表示成功 (1)exit(0)表示成功 grep程序調(diào)用函數(shù)exit(0)來表明成功.所有的Unix程序都遵從以0退出表明成功這一慣例.比如,diff命令用來比較兩個文本文件.類似地,mv.cp和rm都以相同的方式表明成功. (2)帶有else的if語句 else部分就像then部分一樣,可以包含任意數(shù)量的命9.4 9.4 shell的流程控制的流程控制99.4.2 if是如何工作的是如何工作的?If 語句的工作流程主要如下:(1)shell運行if之后的命令(2)shell檢查命令的exit 狀態(tài)(3)exit為0表示成功,非0
6、表示失敗(4)如果成功,shell執(zhí)行then部分的代碼(5)如果失敗,shell執(zhí)行else部分的代碼(6)關(guān)鍵字fi表示if 結(jié)束令,包括其他的if.then 語句.if語句還有另一個特征.如果if后的條件是一系列的命令,那么最后一個命令的exit值被用作這個語句塊的條件值,并由此來決定條件是否成立.101、增加一層:process smsh1的控制流從splitline直接到fork,每個命令都被直接傳給exec.新的版本中,以if.then或者fi開始的行和條件失敗時then語句塊中的命令行不傳給exec.添加if語句后使命令處理變得復雜,所以要寫一個名為process的函數(shù)來包含這些
7、復雜的代碼.9.4.3 在在smsh中增加中增加if112、process做些什么 process通過尋找關(guān)鍵字,比如if.then和fi,來管理腳本流程,在適當?shù)臅r候調(diào)用fork和cess必須記錄條件命令的結(jié)果以便能夠處理then和else塊.3、process是如何工作的? 代碼區(qū)域、 運行狀態(tài) Process通過通過3個函數(shù)來處理區(qū)域問題:個函數(shù)來處理區(qū)域問題:(1)is_control_command(2)do_control_command(3)ok_to_execute12smsh2.cint main() char *cmdline,*prompt,*arglis
8、t; int result,process(char *); void setup(); prompt=DEL_PROMPT; setup(); while(cmdline=next_cmd(propmt,stdin)!=NULL) if(arglist=splitline(cmdline)!=NULL) result=execute(arglist); freelist(arglist); free(cmdline); return 0; void setup()void fatal(char*s1,char*s2,int n) process.c#include #include “sms
9、h.h”int is_control_commmand(char*)int do_control_command(char*)int ok_to_execute()int process(char*arge)controlflow.c#include #include “smsh.h”int syn_err(char*);int ok_to_execute();int is_control_command(char*s)int do_control_commmand(char*args)int syn_err(char *msg)添加兩個新 文件13shell包括兩類變量:局部變量和環(huán)境變量局
10、部變量和環(huán)境變量9.5.1 使用使用shell變量變量9.5 9.5 shell變量:局部和全局變量:局部和全局操作類型操作類型 語法語法 注釋注釋賦值賦值 var=value var=value 不能有空格不能有空格引用引用 $var$var刪除刪除 unset varunset var輸入輸入 read var read var 也可用也可用read var1 var2.read var1 var2. 列出變量列出變量 setset 全局化全局化 export varexport var 14l變量名是字符AZ,az,09和_的組合.第一個字母不能是數(shù)字.變量名對大小寫敏感.l變量的值是字
11、符串.變量都是字符串類型的,沒有數(shù)值類型的變量.所有的操作都是字符串操l列出所有變量使用set命令. Set命令列出當前shell定義的所有變量.159.5.2 變量的存儲變量的存儲1、模型 要在shell里增加變量,必須有個地方能存放這些變量的名稱和值,而且這個變量存儲系統(tǒng)必須能夠分辨局部和全局變量.2、接口 VLtore(char*val,char *val)增加增加/更新更新var=val VLookup(char *var)取得取得var的值的值 VList輸出列表到輸出列表到stdout3、實現(xiàn) 可以用鏈表,hash表,樹或者是幾乎任何數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)它shell變量的存儲方式變量的存
12、儲方式169.5.3 增加變量命令增加變量命令:Built-ins修改process函數(shù),使之在調(diào)用fork/exec之前檢查是否為內(nèi)置的命令修改后的效果修改后的效果:可以正常工作了可以正常工作了TZ沒有傳給沒有傳給Date變量變量$temp和和$day的值沒有正確顯示的值沒有正確顯示向向smsh中添加內(nèi)置命令中添加內(nèi)置命令179.6.1 使用環(huán)境使用環(huán)境 人們喜歡按照自己的喜好設置自己的電腦人們喜歡按照自己的喜好設置自己的電腦,環(huán)境不是環(huán)境不是shell的一部分的一部分,但是但是shell包括一包括一些可以讓用戶讀取和修改環(huán)境的命令些可以讓用戶讀取和修改環(huán)境的命令.學習它怎么工作學習它怎么工
13、作,加到實現(xiàn)的代碼中加到實現(xiàn)的代碼中. 1、列出環(huán)境、列出環(huán)境 env命令列出當前所有環(huán)境設置命令列出當前所有環(huán)境設置.env是一個普通的程序是一個普通的程序,而不是而不是shell內(nèi)置的命內(nèi)置的命令令. 2、更新環(huán)境、更新環(huán)境 (1) var=value 通過變量賦值就可以更新環(huán)境 (2) export var 使用shell內(nèi)置的命令向環(huán)境添加新的變量 (3) 在C程序中讀入環(huán)境 使用標準的C庫函數(shù)gentenv也可以得到環(huán)境變量的值.9.6 9.6 環(huán)境:個性化設置環(huán)境:個性化設置189.6.2 什么是環(huán)境以及它如何工作什么是環(huán)境以及它如何工作環(huán)境是每個程序都可以存取的一個字符串數(shù)組每個
14、數(shù)組中的字符串都以每個數(shù)組中的字符串都以var=value這樣的形式出現(xiàn)這樣的形式出現(xiàn),數(shù)組的地址被數(shù)組的地址被存放在一個名為存放在一個名為environ的全局變量里的全局變量里.環(huán)境就是環(huán)境就是environ指向的字指向的字符串數(shù)組符串數(shù)組,讀環(huán)境就是讀這個字符串數(shù)組讀環(huán)境就是讀這個字符串數(shù)組,改變環(huán)境就是改變字符串改變環(huán)境就是改變字符串,改變這個數(shù)組中的指針或者將這個全局指針指向其他數(shù)組改變這個數(shù)組中的指針或者將這個全局指針指向其他數(shù)組環(huán)境是一個指向字符串的指針數(shù)組環(huán)境是一個指向字符串的指針數(shù)組191、例子:showenv.c功能就像命令env:extern char *environ;m
15、ain() int I; for(I = 0; environi; i+) printf(“%sn”,environi);main() char *table3; table0 = “TERM = vt100”; table1 = “HOME = /on/the/range”; table2 = 0; environ = table; execlp( “env”,”env”,NULL);Changeenv.c改變環(huán)境,然后運行env:202、但是exec清除了所有的數(shù)據(jù)對exec系統(tǒng)調(diào)用就像換腦,用目標程序的代碼和數(shù)據(jù)替換調(diào)用程序的代碼和數(shù)據(jù).但是environ指針指向的數(shù)組是惟一的例外,當內(nèi)
16、核執(zhí)行系統(tǒng)調(diào)用execve時,它將數(shù)組和字符串復制到新的程序的數(shù)據(jù)空間.在生成子進程的過程中,exec清除了原來進程中的所有代碼和數(shù)據(jù),插入新程序的代碼和數(shù)據(jù).3、子進程不能修改父進程的環(huán)境子進程中環(huán)境的設置是父進程環(huán)境的復本,子進程不能修改父進程的環(huán)境,因為在進程調(diào)用fork和exec時整個環(huán)境都被自動的復制了,所以通過環(huán)境來傳遞數(shù)據(jù)比較方便,快捷.219.6.3 在在smsh中增加環(huán)境處理中增加環(huán)境處理1、存取環(huán)境變量2、改變環(huán)境3、對smsh的修改 從環(huán)境復制值到從環(huán)境復制值到vartab將值從將值從vartab復制到新的環(huán)境復制到新的環(huán)境22smsh4.c中的setupvoid set
17、up() extern char *environ; VLenviron2table(environ); signal(SIGINT,SIGIGN); signal(SIGQUIT,SIGIGN); execute2.c中的execute:if(pid=fork()=-1) perror(“fork”);else if(pid=0) environ=VLtable2environ(); signal(SIGINT,SIGDFL); signal(SIGQUIT,SIGDFL); execvp(argv0,argv); perror(“cannot execute command”); exit
18、(1);在在smsh中增加環(huán)境處理中增加環(huán)境處理239.6.4 varlib.c的代碼的代碼#include int VLenviro2table(char *env) #include .#include ”varlib.h” char * VLtable2environ()#include #define MAXVARS 200 static struct var tabMAXVARSstatic char *new_string(char*,char*);static struct war *find_item(char*,int);int VLstore(char *name,char *val).char *new_string*(char *name,char *val).char *VLlookup(char *name).int VLexport(char *name).stati
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新形勢下Mini LED行業(yè)快速做大市場規(guī)模戰(zhàn)略制定與實施研究報告
- 2025-2030年中國超聲熱量表行業(yè)資本規(guī)劃與股權(quán)融資戰(zhàn)略制定與實施研究報告
- 新形勢下北斗衛(wèi)星應用行業(yè)可持續(xù)發(fā)展戰(zhàn)略制定與實施研究報告
- 2025-2030年中國廚房料理小家電行業(yè)并購重組擴張戰(zhàn)略制定與實施研究報告
- 市政道路竣工驗收質(zhì)量評估報告-定稿
- 自動變速器維修試題及答案2
- 微懸浮法糊樹脂新建項目可行性研究報告建議書申請格式范文
- 中國改善睡眠保健品行業(yè)全景評估及投資規(guī)劃建議報告
- 2024-2030年航空運輸行業(yè)投資機會及風險投資運作模式研究報告
- 四年級數(shù)學(四則混合運算)計算題專項練習與答案匯編
- 高速服務區(qū)經(jīng)營分析報告
- 浙江省湖州市2022-2023學年四年級上學期數(shù)學期末試卷(含答案)
- 現(xiàn)場工藝紀律檢查表
- 建井施工方案
- YMO青少年數(shù)學思維28屆五年級全國總決賽試卷
- 烘干廠股東合作協(xié)議書
- 個人業(yè)績相關(guān)信息采集表
- 過敏性紫癜課件PPT
- 大學生暑期社會實踐證明模板(20篇)
- 自來水維修員年度工作總結(jié)
- ASTMB117-2023年鹽霧試驗標準中文
評論
0/150
提交評論