版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第五章Linux
shell程序設(shè)計李威liweizhisjb@163.com1Linux內(nèi)核概述shell層是內(nèi)核之外的中間層,是用戶和系統(tǒng)交互的界面。2Linux內(nèi)核概述在前面章節(jié),shell被解釋為命令解釋程序,即,它接收用戶輸入的命令,然后創(chuàng)建子進程,由子進程實現(xiàn)命令所規(guī)定的功能,等子進程終止工作后發(fā)出提示符。這是shell常見的使用方式。3Linux內(nèi)核概述其實shell還是一種高級程序設(shè)計語言,它有變量、關(guān)鍵字還有各種控制語句4Linux
shell程序設(shè)計Linux提供多種不同的shell。常用的有Bourneshell(簡稱sh)、C-shell(簡稱csh)、Kornshell(簡稱ksh)和BourneAgainshell(簡稱bash)。
5Linux
shell程序設(shè)計Bourneshell是AT&TBell實驗室為AT&T的UNIX開發(fā)的,是UNIX默認的shell6Linux
shell程序設(shè)計C-shell(簡稱csh)是加州伯克利大學(xué)的BillJoy為BSDUNIX開發(fā)的,與sh不一樣7Linux
shell程序設(shè)計Kornshell(簡稱ksh)也是AT&TBell實驗室開發(fā)的,其命令交互界面和編程界面很好8Linux
shell程序設(shè)計BourneAgainshell(簡稱bash)是GNU開發(fā)的一個shell,是Linux默認的shell9Linux
shell程序設(shè)計shell特點:☆對已有命令進行組合構(gòu)成新命令,組合方式簡單;☆提供了文件名擴展字符,使單一字符串可以匹配多個文件名;☆可以直接使用shell的內(nèi)置命令而不需創(chuàng)建新的進程;☆shell靈活使用數(shù)據(jù)流,提供通配符、輸入/輸出重定向、管道線等機制;☆提供了順序流程控制、條件控制、循環(huán)控制語句;☆shell提供了在后臺執(zhí)行命令的能力;☆shell提供了可配置的環(huán)境,允許用戶創(chuàng)建修改命令、命令提示符等系統(tǒng)行為;☆shell提供了一個高級的命令語言,允許用戶創(chuàng)建簡單和復(fù)雜的程序。操作系統(tǒng)本身自帶的命令。不需要外部軟件支持的命令,如:cd、echo、kill等命令10Linux
shell程序設(shè)計shell腳本的創(chuàng)建和執(zhí)行:☆使用shell的最簡單的方法是從鍵盤上直接輸入命令行或存入文件中,這種被shell解釋執(zhí)行的文件為shell腳本?!罾镁庉嬈鹘⒁粋€shell腳本,和普通文件一樣,例:$viex1建立一個名字為ex1的shell腳本11Linux
shell程序設(shè)計☆執(zhí)行shell腳本的方式有三種:(1)$bash<腳本名(2)$bash腳本名[參數(shù)](3)將shell腳本的權(quán)限設(shè)置為可執(zhí)行,然后再提示符下直接執(zhí)行它用輸入重定向讓shell從給定文件中讀入命令行,進行相應(yīng)處理。
以腳本名作為參數(shù)傳遞給程序中的命令例(1)$bash<ex1(2)$·
ex1(3)$chmoda+xex2$./ex2()腳本后面不能帶參數(shù)目前使用的shell以·表示把shell腳本ex2置為對所有用戶都有執(zhí)行權(quán)限,然后在提示符后可以直接執(zhí)行該文件12Linux
shell程序設(shè)計☆bash提供了命令歷史功能,即系統(tǒng)為每一個用戶維護一個命令歷史文件(/root/.bash_history),該文件把用戶輸入的命令自動的加到該命令歷史表中。用戶可以調(diào)用或者修改以前的命令。
$HISTFILE=”/home/.test_history”$HISTSIZE=100可以通過HISTFILE改變存放歷史命令的文件將歷史命令存放在/home/.test_history下設(shè)置歷史文件中可以保留100條歷史命令,默認是50013Linux
shell程序設(shè)計☆顯示命令歷史表中的命令
history[option][arg…]顯示歷史命令,包括剛輸入的history例:$history$history50顯示歷史表中的最后50行命令14Linux
shell程序設(shè)計☆執(zhí)行歷史命令:以字符“!”開頭,后隨一個或多個字符來定義某種類型的歷史命令。(符號間沒有空格)格式意義!!重復(fù)上一條命令,相當于!-1!n重新執(zhí)行第n條歷史命令!-n重新執(zhí)行倒數(shù)第n條歷史命令。!-1等于!??!string重新執(zhí)行以字符串string開頭的最近的歷史命令行。例:!ca表示訪問最近的cat命令!?string?重新執(zhí)行最近的、包含string的歷史命令。例:!?hist?表示重復(fù)前面含有hist的命令15Linux
shell程序設(shè)計☆名稱補全:在bash命令行上輸入目錄名和文件名時,可以按tab鍵讓系統(tǒng)自動補全剩余的部分。例:$cd/us$cate系統(tǒng)自動補全/usr如果目錄中有ex1、ex2、exam1則系統(tǒng)會補全到三者相同部分的最后一個字符,屏幕顯示為$catex,如果此時用戶繼續(xù)按Tab鍵,屏幕顯示為$catexex1ex2exam1等待用戶選擇16Linux
shell程序設(shè)計☆別名:對于常用的選項或參數(shù)比較多的固定命令可以取個別名替換,定義別名的命令
alias[name[=value]]…
例:$alias$aliasll=’ls-l’$ll$aliasll=ls-l$ll在屏幕上顯示別名清單等價于$ls-l等價于$ls17Linux
shell程序設(shè)計☆別名:對于常用的選項或參數(shù)比較多的固定命令可以取個別名替換,定義別名的命令
alias[name[=value]]…☆取消別名:unaliasname執(zhí)行后從別名表中刪除name指定的別名18Linux
shell程序設(shè)計19Linux
shell程序設(shè)計☆模式表達式:除了*、?和[…]之外還有以下形式:(1)*(模式表):匹配給定模式表中的模式的0次或多次出現(xiàn),各模式以|分開;(2)+(模式表):匹配給定模式表中的模式的1次或多次出現(xiàn),各模式以|分開;(3)?(模式表):匹配給定模式表中任一模式的0次或1次出現(xiàn),各模式以|分開;(4)@(模式表):僅匹配模式表中的給定模式的1次出現(xiàn);(5)?。J奖恚撼o定模式表中的模式外匹配其他任何模式20Linux
shell程序設(shè)計例:file*(.c|.o)將匹配文件file、file.c、file.o、file.c.c、file.o.o、file.c.o、file.o.c等
file+(.c|.o)將匹配文件file.c、file.o、file.c.c、file.o.o、file.c.o、file.o.c等,不匹配file
file?(.c|.o)只匹配文件file、file.c、file.o,不匹配file.c.c、file.o.o、file.c.o、file.o.c等,
file@(.c|.o)只匹配文件file.c、file.o不匹配file、file.c.c、file.o.o、file.c.o、file.o.c等21Linux
shell程序設(shè)計☆引號:分為單引號、雙引號和倒引號。用雙引號括起來除$、倒引號(`)和反斜線(\)之外都作為普通字符對待,$表示變量替換;倒引號(`)表示命令替換;反斜線(\)表示轉(zhuǎn)義字符。單引號括起來的字符表示都是普通字符。倒引號(`)括起來的字符被shell解釋為命令行。22Linux
shell程序設(shè)計例:$catex3echo“currentdirectoryis`pwd`”echo”homedirectoryis$HOME”echo“file*.?”$bashex3currentdirectoryis/homehomedirectoryis/rootfile*.?23Linux
shell程序設(shè)計☆注釋:shell程序中以#開頭的正文行表示注釋;在shell腳本的第一行以#!開頭表示該腳本是用哪種shell編寫的,從而調(diào)用相應(yīng)的解釋程序執(zhí)行?!詈笈_命令:當程序執(zhí)行需要時間過長時,那么在命令最后輸入&符號,則shell在后臺啟動該程序,馬上顯示下一個提示符,允許用戶輸入新的命令。24Linux
shell程序設(shè)計等價于pwd這里分號隔開的命令,前面的命令執(zhí)行成功who|wc–l與否并不影響后面命令的執(zhí)行
cd/home☆命令執(zhí)行操作符:多條命令可以在一行中出現(xiàn),各命令之間以分號隔開,例pwd;who|wc-l;cd/home25Linux
shell程序設(shè)計☆命令執(zhí)行操作符:邏輯與操作符&&可將兩個命令聯(lián)系在一起,命令1&&命令2表示先執(zhí)行命令1,如果執(zhí)行成功才執(zhí)行命令2,否則不執(zhí)行命令2。邏輯非操作符||可將兩個命令聯(lián)系在一起,命令1||命令2表示先執(zhí)行命令1,如果不成功則執(zhí)行命令2,如果命令成功則不執(zhí)行命令2。26Linux
shell程序設(shè)計27Linux
shell程序設(shè)計☆成組命令:在shell中有兩種方式將若干命令組合在一起,一個是花括號,一個是圓括號;(1){…;}形式:以花括號括起來的全部命令作為一條命令執(zhí)行,左括號后有一個空格右括號前有分號
(2)(…)形式:左括號后不需有空格,右括號之前也不需加分號例:${echo“userreportfor`date`”;who;}|cat(echo和who命令的執(zhí)行結(jié)果經(jīng)管道傳給屏幕進行輸出)28Linux
shell程序設(shè)計二者區(qū)別:花括號括起來的組命令在本shell執(zhí)行命令,不產(chǎn)生新進程;圓括號括起來的組命令要在新的子shell內(nèi)執(zhí)行,要建立新的子進程。29Linux
shell程序設(shè)計shell有兩類變量:環(huán)境變量和臨時變量。環(huán)境變量是永久性變量,值不會隨shell腳本執(zhí)行結(jié)束而消失;臨時變量是在shell程序內(nèi)部定義,使用范圍僅限于定義它的程序,出了程序就不能使用,程序結(jié)束后,它的值就不存在了。環(huán)境變量像$HOME(用戶主目錄的全路徑)$LOGNAME(用戶的注冊名,通過該變量系統(tǒng)來確認用戶是否是文件的擁有者,是否有權(quán)利執(zhí)行某個命令)$PATH(shell從中查找命令的目錄列表,例:PATH=$PATH:/home)
30Linux
shell程序設(shè)計☆用戶定義的變量:變量名是以字母或下劃線開頭,由字母、下劃線和數(shù)字組成的序列。大小寫意義不同,變量長度不受限制。定義變量并賦值的一般形式變量名=字符串引用變量時用“$變量”31Linux
shell程序設(shè)計例:$dir=/home/ccc$echo$dir$echodir$today=Sunday$echo$today$Today$dir=/home/cc$cat${dir}c/mi.c$cat$dirc/mi.c$cat$dir/mi.c顯示結(jié)果/home/ccc顯示結(jié)果dir顯示結(jié)果SundayToday未被賦值,為空串將文件/home/ccc/mi.c顯示出來提示出錯,認為dirc是個新變量,前面未賦值,所以找不到文件mi.c將文件/home/cc/mi.c顯示出來32Linux
shell程序設(shè)計☆數(shù)組:bash只提供一維數(shù)組,數(shù)組元素下標由0開始編號。一般形式為:declare
–a數(shù)組名讀取數(shù)組元素值的一般形式是:${數(shù)組名[下標]}對數(shù)組元素賦值的一般形式是:數(shù)組名[下標]=值或數(shù)組名=(值1值2……值n)33Linux
shell程序設(shè)計例:$city[0]=Beijing$city[1]=Shanghai$echo${city[0]}$A=(thisisanexampleofshellscript)$echo${A[0]}${A[2]}${A[3]}${A[6]}$echo${A[8]}顯示結(jié)果Beijing顯示結(jié)果結(jié)果顯示為thisanexamplescript顯示結(jié)果結(jié)果顯示為空串34Linux
shell程序設(shè)計☆輸入命令——read命令:從鍵盤上讀取數(shù)據(jù),然后賦給指定的變量,例$readxyzTodayisMonday$echo$z$x$y顯示結(jié)果Monday
Todayis35Linux
shell程序設(shè)計☆輸入命令——read命令:從鍵盤上讀取數(shù)據(jù),然后賦給指定的變量,例$readn1n2n3FirstSecondThird1234abcd(回車鍵)
$echo$n3
$echo$n2$n1變量個數(shù)少于數(shù)據(jù)個數(shù)時,從左往右對應(yīng)賦值,最后一個變量被賦予剩余的所有數(shù)據(jù)顯示結(jié)果為Third1234abcd顯示結(jié)果為SecondFirst36Linux
shell程序設(shè)計☆輸入命令——read命令:從鍵盤上讀取數(shù)據(jù),然后賦給指定的變量,例$readn1n2n312(回車鍵)
$echo$n3$echo$n2$n1變量個數(shù)多于給定的數(shù)據(jù)個數(shù)時,依次對應(yīng)賦值,沒有數(shù)據(jù)對應(yīng)的取空串顯示結(jié)果為空串顯示結(jié)果為2137Linux
shell程序設(shè)計☆預(yù)先定義的特殊變量(1)$#——命令行上參數(shù)的個數(shù)(2)$?——上一條命令的返回值,執(zhí)行成功為0;執(zhí)行失敗返回非0值(3)$$——當前進程的進程號(4)$!——上一個后臺命令對應(yīng)的進程號,由1~5位數(shù)字構(gòu)成(5)$-——由當前shell設(shè)置的執(zhí)行標志名組成的字符串(6)$*——表示在命令行中實際給出的所有實參字符串例ex6m1.cm2.c($#值為2)38Linux
shell程序設(shè)計39Linux
shell程序設(shè)計bash中執(zhí)行整數(shù)算術(shù)運算的命令是let,語法格式:letarg…
例:let“j=i*6+2”等價于((j=i*6+2))40Linux
shell程序設(shè)計優(yōu)先級運算符結(jié)合性功能1-、+從右至左取表達式負值、正值2!、~從右至左邏輯非、按位取反3**從左至右方冪4*、/、%從左至右乘、除、取模5+、-從左至右加、減6<<、>>從左至右左移若干二進制位、右移若干二進制位、41Linux
shell程序設(shè)計7>、>=、<、<=從左至右大于、大于或等于、小于、小于或等于8==、!=從左至右相等、不相等9&從左至右按位與10^從左至右按位異或11|從左至右按位或12&&從左至右邏輯與13||從左至右邏輯或14?:從右至左條件計算15=、+=、-=、*=/=、%=&=、^=、|=、<<=、>>=從右至左賦值運算且賦值42Linux
shell程序設(shè)計注意:當表達式中有shell特殊字符時,必須用雙引號括起來。例:$let“v=6|5”$echo$v$let
v=6|5
顯示結(jié)果為7結(jié)果提示出錯,把|看成管道符,左右兩邊由于不是命令因而無法正確執(zhí)行43Linux
shell程序設(shè)計☆if語句一般格式:if測試條件then命令1else命令2fi
44Linux
shell程序設(shè)計例:
iftest-f“$1”thenecho“$1isanordinaryfile.”
elseecho“$1isnotanordinaryfile.”fi
通過test命令測試$1是否是一個已存在的普通文件,如果是則顯示$1isanordinaryfile.否則顯示$1isnotanordinaryfile45Linux
shell程序設(shè)計例:
iftest-f“$1”thenecho“$1isanordinaryfile.”
elseecho“$1isnotanordinaryfile.”fi
用test命令或一對方括號括起來是等價的,
test–f“$1”等價于[–f“$1”]
46Linux
shell程序設(shè)計☆條件測試命令——test(1)文件測試運算符及其功能參數(shù)功能-r文件名若文件存在并且是用戶可讀的,則測試條件為真-w文件名若文件存在并且是用戶可寫的,則測試條件為真-x文件名若文件存在并且是用戶可執(zhí)行的,則測試條件為真-f文件名若文件存在并且是普通文件,則測試條件為真-d文件名若文件存在并且是目錄文件,則測試條件為真-p文件名若文件存在并且是命名的FIFO文件,則測試條件為真-b文件名若文件存在并且是塊設(shè)備文件,則測試條件為真-c文件名若文件存在并且是字符設(shè)備文件,則測試條件為真-s文件名若文件存在并且文件長度大于0,則測試條件為真-t文件描述字如果文件被打開其文件描述字是與終端設(shè)備相關(guān)的,則測試條件為真47Linux
shell程序設(shè)計(2)有關(guān)字符串方面的測試參數(shù)功能-zs1如果字符串s1的長度為0,則測試條件為真-ns1如果字符串s1的長度大于0,則測試條件為真s1如果字符串s1不是空字符串,則測試條件為真s1=s2如果s1等于s2,則測試條件為真s1?。絪2如果s1不等于s2,則測試條件為真s1<s2如果按字典順序s1在s2之前,則測試條件為真s1>s2如果按字典順序s1在s2之后,則測試條件為真48Linux
shell程序設(shè)計(3)有關(guān)數(shù)值方面的測試參數(shù)功能n1–eqn2如果整數(shù)n1等于n2,則測試條件為真n1–nen2如果整數(shù)n1不等于n2,則測試條件為真n1–ltn2如果整數(shù)n1小于n2,則測試條件為真n1–len2如果整數(shù)n1小于或等于n2,則測試條件為真n1–gtn2如果整數(shù)n1大于n2,則測試條件為真n1–gen2如果整數(shù)n1大于或等于n2,則測試條件為真49Linux
shell程序設(shè)計(4)邏輯運算符參數(shù)功能!放在任意邏輯表達式之前,使原來的表達式變?yōu)榧?a放在兩個邏輯表達式之間,當兩個表達式為真時,結(jié)果為真-o放在兩個邏輯表達式之間,其中只要一個表達式為真時,結(jié)果就為真()把一個邏輯表達式括起來,使其優(yōu)先得到運算50Linux
shell程序設(shè)計(5)特殊條件測試:表示不作任何事情,退出值為0ture表示總為真,退出值總是0false表示總為假,退出值總是25551Linux
shell程序設(shè)計☆case語句,一般語法形式為case字符串in
模式字符串1)命令
…
命令;;模式字符串2)命令…
命令;;…模式字符串n)命令…
命令;;esac執(zhí)行過程如下:用字符串依次同各模式字符串進行比較,如果發(fā)現(xiàn)某一個匹配,那就執(zhí)行該模式字符串之后的命令,直至遇到兩個分號為止;如果沒有任何模式字符串與該字符串的值相符合,則不執(zhí)行任何命令注意:(1)每個模式字符串后面可有一條或多條命令,其最后一條命令必須用兩個分號結(jié)束;(2)模式字符串中可以使用通配符;(3)如果模式字符串中包含多個模式,那么各模式之間應(yīng)以豎線(|)隔開,表示各模式是或的關(guān)系;(4)各模式字符串應(yīng)是唯一的,不重復(fù)出現(xiàn);(5)要以case開頭以esac結(jié)束;(6)case的返回值是整個結(jié)構(gòu)中最后執(zhí)行的那個命令的退出值,若沒有執(zhí)行任何命令,則返回值為052Linux
shell程序設(shè)計☆while語句一般語法形式為:while測試條件do
命令表done執(zhí)行過程如下:先進行條件測試,如果結(jié)果為真則進入循環(huán)體,執(zhí)行其中的命令;然后再作條件測試……,直至測試條件為假才終止while語句的執(zhí)行。53Linux
shell程序設(shè)計☆until語句一般語法形式如下:until測試條件do
命令表done執(zhí)行過程如下:測試條件為假時進入循環(huán)體,直至測試條件為真時終止循序54Linux
shell程序設(shè)計for變量in值表do
命令表done執(zhí)行過程如下:變量依次取值表里的各個值,然后執(zhí)行命令表☆for語法一般語法主要有三種,(1)格式一:55Linux
shell程序設(shè)計例:fordayinMondayWednesdayFridaySundaydoecho$daydone執(zhí)行過程如下:變量day依次取值表里的各個值,第一次將Monday賦給day,然后執(zhí)行命令“echo$day”;第二次將Wednesday賦給day……☆for語法一般語法主要有三種,(1)格式一:56Linux
shell程序設(shè)計for變量in文件正則表達式do
命令表done執(zhí)行過程如下:取當前目錄下與正則表達式相匹配的文件名,每取值依次就進入循環(huán)體執(zhí)行命令表一次☆for語法一般語法主要有三種(2)格式二:57Linux
shell程序設(shè)計例:forfileinm*.cdocat$file|prdone執(zhí)行過程如下:將當前目錄下所有以m開頭的C程序文件按分頁格式顯示出來☆for語法一般語法主要有三種(2)格式二:58Linux
shell程序設(shè)計foriin$*do
命令表doneforido或者命令表done☆for語法一般語法主要有三種(3)格式三:執(zhí)行過程如下:變量i依次取位置參數(shù)的值,然后執(zhí)行循環(huán)體中的命令表,直至所有位置參數(shù)取完為止59Linux
shell程序設(shè)計☆位置參數(shù):執(zhí)行UNIX/Linux命令或Shell腳本時,Shell傳遞給腳本的參數(shù),例:bashex1/home/l1ex15ex16ex17——實參$0$1$2$3$4注意:$0始終對應(yīng)腳本名,不能為空;其他位置變量的值可以為空串——位置參數(shù)60Linux
shell程序設(shè)計例:bashex1/home/l1ex15ex16ex17$0$1$2$3$4注意:shift——移動位置命令,每執(zhí)行一次,實參就左移一位,相當于位置參數(shù)右移一位☆位置參數(shù):執(zhí)行UNIX/Linux命令或Shell腳本時,Shell傳遞給腳本的參數(shù),61Linux
shell程序設(shè)計例:命令行:bashex7ABCDEF$0$1$2$3$4shift后位置參數(shù)原位置:參數(shù)$5$6$0$1$2$3$4$562Linux
shell程序設(shè)計請解釋下列程序并給出最終結(jié)果#ex8ec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度房地產(chǎn)項目投資分析委托合同3篇
- 銷售活動方案策劃書
- 物聯(lián)網(wǎng)公有云下流量分析-洞察分析
- 2024年有限責任公司增資擴股、健康醫(yī)療產(chǎn)業(yè)合作及市場拓展協(xié)議3篇
- 印刷質(zhì)量管理-洞察分析
- 2024年度地熱地板工程安裝與維護服務(wù)協(xié)議3篇
- 采購合同的履行保障3篇
- 采購合同跟蹤的案例分析與策略研究3篇
- 采購合同預(yù)付款的信用風(fēng)險管理3篇
- 采購合同會審制度的特點分析3篇
- 小學(xué)科學(xué)實驗圖片和文字
- 2023年法考鐘秀勇講民法講義電子版
- 施工單位自查自糾記錄表
- 產(chǎn)品合格證出廠合格證A4打印模板
- IEC60287中文翻譯版本第一部分課件
- 《公路隧道設(shè)計細則》(D70-2010 )【可編輯】
- 農(nóng)業(yè)開發(fā)有限公司章程范本
- GB 4806.11-2023食品安全國家標準食品接觸用橡膠材料及制品
- 化工企業(yè)隱患排查與治理
- 自然辯證法智慧樹知到課后章節(jié)答案2023年下浙江大學(xué)
- 循環(huán)冷卻水處理和“趨零”排放新技術(shù)
評論
0/150
提交評論