linuxShell及其程序設計_第1頁
linuxShell及其程序設計_第2頁
linuxShell及其程序設計_第3頁
linuxShell及其程序設計_第4頁
linuxShell及其程序設計_第5頁
已閱讀5頁,還剩58頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第五講 shell程序設計 Shell概述 Shell基本功能 Shell環(huán)境配置 Shell腳本基礎 Shell腳本控制語句(教材第七、八、十八、十九章)Shell概述 用戶操作計算機的界面 圖形界面:適宜辦公應用、圖形設計 命令行界面:系統(tǒng)管理、應用開發(fā) 內(nèi)置命令和外部命令 cdpwdtpye用戶輸入的命令Shell分析處理內(nèi)置命令由Shell執(zhí)行,外部命令執(zhí)行對應的可執(zhí)行文件 登錄shell 切換到其他 shellshcshShell概述 命令解釋程序 高級程序設計語言,它有變量,關鍵字,有各種控制語句,如if、case、while、for等語句,支持函數(shù)模塊,有自己的語法結構 Shel

2、l的種類 Bourne shell(簡稱sh) C shell(csh) Korn shell(ksh) Bourne Again shell(bash)簡單shell程序示例例:由簡單命令組成的shell程序(文件名為ex1.sh)$ cat ex1.sh#!/bin/bashdatepwdcd .Pwdexit 0例: 帶有控制結構的shell程序(文件名為ex2.sh)$ cat ex2.sh#!/bin/bash# If no arguments, then listing the current directory.# Otherwise, listing each subdirec

3、tory.if test $# = 0then ls .else for i in $* do ls -l $i | grep d donefiexit 0Shell程序文件的建立和執(zhí)行1. 建立shell程序文件$ vi ex1.sh2. 執(zhí)行shell腳本(1) 以腳本名作為參數(shù):bash 腳本名$ bash ex1.sh$ bash ex2.sh /etc /boot /usr(2) 給shell程序文件權限執(zhí)行權限,直接執(zhí)行$ chmod a+x ex2.sh$ ./ex2.sh /etc /boot /usr(3) 在用戶登錄shell進程中執(zhí)行一個shell腳本 $ 腳本名 參數(shù)S

4、hell基本功能 自動補全 別名 歷史 文件名通配符 輸入輸出重定向 管道 命令替換 子Shell自動補全 可以輸入目錄名或文件名的開頭部分,然后按鍵,Shell根據(jù)輸入的字母查找以這些字母開頭的目錄或文件,并自動補全剩余的部分。 $ alias$ al$ dmesg別名 定義別名alias name=value 顯示別名$ alias 定義別名時,用單引號將它代表的內(nèi)容括起來,從而防止Shell對對空格和特殊字符另作解釋$ alias ll=ls l 取消別名$ unalias name 取消所有別名$unalias -a歷史語法格式是:history option arg 顯示歷史命令清單

5、 history 后給出一個正整數(shù)(如50),就只顯示歷史表中的最后50行命令 常用的選項有: -a 將本次登錄操作的命令清單寫入指定文件 -r 讀取歷史文件的內(nèi)容到命令清單 -w 將本次登錄操作的命令清單寫入歷史文件 -c 刪除本次登錄操作的命令清單中內(nèi)容 執(zhí)行歷史命令 執(zhí)行歷史命令是命令替換之一,它以字符“!”開頭、后隨1個或多個字符來定義用戶所需的某種類型的歷史命令 基本的事件指定字格式 格 式 意 義 ! 重復上一條命令,也就是“!-1” !n 重新執(zhí)行第n條歷史命令 !-n 重新執(zhí)行倒數(shù)第n條歷史命令。!-1就等于! ! !string 重新執(zhí)行以字符串string開頭的最近的歷史命

6、令行。!?string? 重新執(zhí)行最近的、包含字符串string的那條歷史命令 !# 到現(xiàn)在為止所輸入的整個命令行 文件名通配符*(星號) 它匹配任意字符的0次或多次出現(xiàn) ?(問號) 它匹配任意一個字符 (一對方括號) 其中有一個字符組。其作用是匹配該字符組所限定的任何一個字符!(驚嘆號) 如果它緊跟在一對方括號的左方括號()之后,則表示不在一對方括號中所列出的字符$ ls l *.c$ cp f?.c mydir$ cp f0123? mydir輸入/輸出重定向1輸入重定向符 一般形式是:命令 文件名 $ write 2011013319 文件名 $ who file23輸出附加定向符 一般

7、形式是:命令文件名 $ ps psfile 輸入和輸出重新定向可以連在一起使用,例: $ wc -l outfile$ wc -l infile outfile4即時文件定向符 即時文件的形式是: 命令 參數(shù) 標記符 輸入行 標記符 注意:標記符要成對出現(xiàn) $ mail 2011013319 文件名 命令 2 文件名 標準輸出和標準錯誤輸出可以重定向到同一個文件: $ find /usr/local -name httpd file 2& 1管道、后臺命令 1. 管道 ls -l $HOME | wc l ls | grep m?.c | wc l2. 后臺命令 $ gcc m1.c

8、-o m1 & $ find /usr/local -name httpd file 2& 1 &命令執(zhí)行操作符1順序執(zhí)行 在執(zhí)行時,以分號隔開的各條命令從左到右依次執(zhí)行 pwd ; who | wc -l ; cd /usr/bin2邏輯與 命令1 & 命令2 其功能是,先執(zhí)行命令1,如果執(zhí)行成功,才執(zhí)行命令2;否則,若命令1執(zhí)行不成功,則不執(zhí)行命令2。 3邏輯或 命令1 | 命令2 其功能是,先執(zhí)行命令1,如果執(zhí)行不成功,則執(zhí)行命令2;否則,若命令1執(zhí)行成功,則不執(zhí)行命令2。 組合命令、子shell1 形式 以花括號括起來的全部命令可視為語法上的一條命令,出

9、現(xiàn)在管道符的一邊。 $ echo “User Report for date . ”; who ; | pr 使用花括號時在格式上應注意:左括號 “ ”后面應有一個空格;右括號“”之前應有一個分號( ;)2( )形式 (echo Current directory is pwd . cd /home/mengqc ; ls -l ; cp m1 em1 & rm m1 cat em1) | pr 和()的區(qū)別區(qū)別:用花括號括起來的成組命令只是在本shell內(nèi)執(zhí)行命令表,不產(chǎn)生新的進程;而用圓括號括起來的成組命令是在新的子shell內(nèi)執(zhí)行,要建立新的子進程。 變量1. 變量名 是以字母或

10、下線符打頭的字母、數(shù)字和下線符序列,并且大小寫字母意義不同。 2. 定義變量并賦值的一般形式是: 變量名=字符串3. 引用變量值 在變量名前面加上一個符號“$” 如果在賦給變量的值中要含有空格、制表符或換行符,那么,就應該用雙引號把這個字符串括起來。 $ names=Zhangsan Lisi Wangwu“ $ echo $names 如果變量值須出現(xiàn)在長字符串的開頭或者中間,為了使變量名與其后的字符區(qū)分開,避免shell把它與其它字符混在一起視為一個新變量,則應該用花括號將該變量名括起來。例如,$ dir=/usr/meng $ cat $dirqc/m1.c4命令替換 命令表str1=l

11、s . 另一種形式是: $(命令表)$ dir=$(pwd)$ echo $(pwd; cd /home/mengqc; ls -d)數(shù)組 bash只提供一維數(shù)組,并且沒有限定數(shù)組的大小。類似與C語言,數(shù)組元素的下標由0開始編號。 對數(shù)組元素賦值的一般形式是: 數(shù)組名下標值 可以用declare命令顯式聲明一個數(shù)組,一般形式是: declare -a 數(shù)組名 讀取數(shù)組元素值的一般格式是:$數(shù)組名下標 定義一個數(shù)組并為其賦初值的一般形式是: 數(shù)組名=(值1 值2 值n)其中,各個值之間以空格分開。 若沒有給出數(shù)組元素的下標,則數(shù)組名表示下標為0的數(shù)組元素 使用*或當作下標,則會以數(shù)組中所有元素取

12、代*或 表達式$name表示變量name的值,若變量未定義,則用空值替換。 表達式$name將被變量name的值替換。用花括號括起name,目的在于把變量名與后面的字符分隔開,避免出現(xiàn)混淆。替換后花括號被取消。 $namen表示數(shù)組變量name中第n個元素的值。 表達式$name*和$name都表示數(shù)組name中所有非空元素的值,每個元素的值用空格分開。如果用雙引號把它們都括起來,那么二者的含義就有區(qū)別:對于$name*,它被擴展成一個詞(即字符串),這個詞由以空格分開的各個數(shù)組元素組成;對于$name,它被擴展成多個詞,每個數(shù)組元素是一個詞。如果數(shù)組name中沒有元素,則$name被擴展為空

13、串。 變量引用輸入/輸出命令1read命令 可以利用read命令從鍵盤上讀取數(shù)據(jù),然后賦給指定的變量。read命令的一般格式是: read 變量1 變量2 變量個數(shù)與給定數(shù)據(jù)個數(shù)相同,則依次對應賦值 變量個數(shù)少于數(shù)據(jù)個數(shù),則從左至右對應賦值,但最后一個變量被賦予剩余的所有數(shù)據(jù)。 變量個數(shù)多于給定數(shù)據(jù)個數(shù),則依次對應賦值,而沒有數(shù)據(jù)與之對應的變量取空串2 echo命令顯示其后的變量值或者直接顯示它后面的字符串 如果echo命令帶有選項“-e”,那么在其后的參數(shù)中可以有轉義字符: a b c e f n r t v 例:一個特洛伊木馬shell程序(Trojan.sh)。#!/bin/bash e

14、cho -n Login: read namestty -echoecho -n Password: read passwdecho stty echoecho $name $passwd /tmp/ttt&sleep 2echo Login Incorrect.Re-enter, Please. stty cookedexit 0位置參數(shù)1位置參數(shù)及其引用位置變量的名稱很特別,分別是0,1,2, 命令行實參與腳本中位置變量的對應關系如下所示:引用它們的方式依次是$0, $1, $2, , $9, $10, $11等。其中,$0始終表示命令名或shell腳本名。 位置變量不能通過一般賦

15、值的方式直接賦值 通過命令行上對應位置的實參傳值 2用set命令為位置參數(shù)賦值移動位置參數(shù) 每執(zhí)行一次shift命令,就把命令行上的實參向左移一位,即相當于位置參數(shù)向右移動一個位置。 shift命令不能將$0移走,所以經(jīng)shift右移位置參數(shù)后, $0的值不會發(fā)生變化。 shift命令可以帶有一個整數(shù)作為參數(shù)預先定義的特殊變量$# 命令行上參數(shù)的個數(shù),但不包含shell腳本名本身。因 此,$#可以給出實際參數(shù)的個數(shù)。$? 上一條命令執(zhí)行后的返回值(也稱作 “返回碼”、 “退出狀態(tài)”、“退出碼”等)。它是一個十進制數(shù)。$ 當前進程的進程號。$! 上一個后臺命令對應的進程號,這是一個由15位數(shù)字構

16、成的數(shù)字串。$* 表示在命令行中實際給出的所有實參字符串,它并不僅限于9個實參。$ 它與$*基本功能相同,即表示在命令行中給出的所有實參。但“$”與“$*”不同。環(huán)境變量1. 常用的環(huán)境變量HOME 用戶主目錄的全路徑名 LOGNAME 即你的注冊名,由Linux自動設置MAIL 你的系統(tǒng)信箱的路徑PATH shell從中查找命令的目錄列表,可以設置它:如:PATH=$PATH:$HOME/binPS1 shell的主提示符sh默認的主提示符為“s-v$ ”s表示shell的名稱;v表示bash的版本號bash默認的主提示符為 uh w$ PS2 shell二級提示符PWD 你當前工作目錄的路

17、徑SHELL 你當前使用的shellTERM 你的終端類型2. 使用環(huán)境變量 如果要使用環(huán)境變量或其它shell變量的值,必須在變量名之前加上一個“$”符號,不能直接使用變量名。$ cd $HOME3刪除環(huán)境變量$ unset NAME環(huán)境文件 bash的環(huán)境文件包括.bash_profile.bashrc.bash_logout 在.bash_profile中,設置了環(huán)境變量和文件掩碼(umask) 名為.bashrc的腳本,每次啟動bash時便會執(zhí)行它。它只含有針對bash的命令,可以用來設置別名。.bashrc在.bash_profile之后執(zhí)行 .bash_logout,它僅在退出注冊

18、的時候運行 export語句與環(huán)境設置1export語句一個進程在自己的環(huán)境中定義的變量是局部變量,僅限于自身范圍,不能自動傳給其子進程。就是說,子進程只能繼承父進程的公用區(qū)和轉出區(qū)中的數(shù)據(jù),而每個進程的數(shù)據(jù)區(qū)和棧區(qū)是私有的,不能繼承。為了使其后的各個子進程能繼承父進程中定義的變量,就必須用export(轉出)命令將這些變量送入進程轉出區(qū)。 export命令的一般使用形式是:export 變量名 2環(huán)境變量的設置和顯示 設置變量要用如下形式:變量名=值 如果變量值的字符串中帶有空格等特殊字符,需要用引號把整個字符串括起來。 例如:$ PS1= 利用export命令將這些變量輸出,使它們成為公用

19、量。如: export HOME HZ LOGNAME TERM 可以利用env命令列出所有的環(huán)境變量,包括本進程及以前的“祖先進程”所輸出的變量3set命令 顯示全部變量,包括局部量和公用量 設定shell腳本執(zhí)行環(huán)境 設定位置參數(shù)的值 設置標志的一般形式是: set -標志 例如:set -x 關閉標志的一般形式是: set +標志 例如:set +x設定變量替換 一般形式是變量2=$ 變量1 op 字符串 表示操作符op: : = : + : ? 變量2的值取決于變量1(參數(shù))是否為空串、利用哪個操作符以及字符串的取值echo -n Please enter TERM1 ( defaul

20、t is ansi ) read terminalTERM1=$terminal:-ansi echo terminal type is $TERM1 now . echo terminal=$terminal “ 在操作符的前后不留空格 求子串$ x=abcd1234; echo $x:2:3四種參數(shù)置換變量的格式與功能 格 式 var1為空 var1不為空var2=$ var1:-string var2=string,var1不變 var2=$var1,var1不變 var2=$var1:=string var2=stringvar1=stringvar2=$var1var1不變var2=

21、$var1:+string var2為空,var1不變var2=string,var1不變var2=$var1:?string 輸出格式:腳本名: var1:string并退出shellvar2不變 var2=$var1,var1不變 算術運算 bash中執(zhí)行整數(shù)算術運算的命令是let,格式為:let arg 其中arg是單獨的算術表達式。它使用C語言中表達式的語法、優(yōu)先級和結合性。所有整型運算符都得到支持,此外,還提供了方冪運算符“*”。 在算術表達式中直接利用名稱訪問命名的參數(shù),不要前面帶有“$”符號 let 命令的替代表示形式是:(算術表達式) 例如:let j=i*6+2等價于: (j

22、=i*6+2)如果表達式的值非0,返回狀態(tài)值0;否則,返回狀態(tài)值1。 當表達式中有shell的特殊字符時,必須用雙引號將其括起來。例let val=a|b 使用 $(算術表達式) 形式返回表達式的值 使用expr命令例z=expr x + y控制結構if 測試條件then命令1else命令2fi if、then、else和fi是關鍵字,例如:if test -f $1thenecho $1 is an ordinary file . elseecho $1 is not an ordinary file . fi if語句中else部分可以缺省。例如: if test -f $1 then e

23、cho $1 is an ordinary file . fi if 語句的else部分還可以是elseif結構,則用關鍵字“elif”代替“else if”。例如:if test - f $1then pr $1elif test - d $1then ( cd $1 ; pr * )else echo $1 is neither a file nor a directory .fi例:if語句的應用(ex10.sh)。#!/bin/bashecho Type in the user name . read userif grep $user /etc/passwd /tmp/null wh

24、o | grep $userthen echo $user has logged in the system . cp /tmp/null tmp1 rm /tmp/nullelse echo $user has not logged in the system .fiexit 0測試條件 條件測試三種常用形式: test命令 方括號例,測試位置參數(shù)$1是否是已存在的普通文件: test -f $1也可寫成: -f $1 條件表達式 test命令可以和文件測試運算符、字符串測試運算符、數(shù)值測試運算符和邏輯運算符結合應用1有關文件方面的測試 參 數(shù) 功 能 -r 文件名 若文件存在并且是用戶可讀

25、的,則測試條件為真 -w 文件名 若文件存在并且是用戶可寫的,則測試條件為真 -x 文件名 若文件存在并且是用戶可執(zhí)行的,則測試條件為真-f 文件名 若文件存在并且是普通文件,則測試條件為真 -d 文件名 若文件存在并且是目錄文件,則測試條件為真 -p 文件名 若文件存在并且是命名的FIFO文件,則測試條件為真-b 文件名 若文件存在并且是塊設備文件,則測試條件為真 -c 文件名 若文件存在并且是字符設備文件,則測試條件為真 -s 文件名 若文件存在并且文件的長度大于0,則測試條件為真 -t 文件描述字 若文件被打開且其文件描述字是與終端設備相關的,則測試條件為真。默認的“文件描述字”是1 2

26、有關字符串方面的測試 參 數(shù) 功 能 -z s1如果字符串s1的長度為0,則測試條件為真。 -n s1如果字符串s1的長度大于0,則測試條件為真。 s1如果字符串s1不是空字符串,則測試條件為真。 s1 = s2如果s1等于s2,則測試條件為真?!啊币部梢杂谩啊贝妗T凇啊鼻昂髴锌崭?。 s1 != s2如果s1不等于s2,則測試條件為真。 s1 s2如果按字典順序s1在s2之后,則測試條件為真3有關數(shù)值方面的測試 參 數(shù) 功 能 n1 -eq n2如果整數(shù)n1等于n2,則測試條件為真 n1 -ne n2 如果整數(shù)n1不等于n2,則測試條件為真 n1 -lt n2 如果n1小于n2,則測試條件

27、為真 n1 -le n2如果n1小于或等于n2,則測試條件為真 n1 -gt n2如果n1大于n2,則測試條件為真 n1 -ge n2如果n1大于或等于n2,則測試條件為真4邏輯運算符 ! 邏輯非( NOT ),它放在任意邏輯表達式之前,使原來為真的表達式變?yōu)榧?,使原來為假的變?yōu)檎?。例如?! -r $1 , ! test -r $1等。 - a 邏輯與( AND ),它放在兩個邏輯表達式中間,僅當兩個表達式都為真時,結果才為真。例如, - f $myfile - a - r $myfile - o 邏輯或( OR ),它放在兩個邏輯表達式中間,其中只要有一個表達式為真,結果就為真。例如, $

28、a -ge 0 -o $b -le 100 (表達式) 圓括號,它可以把一個邏輯表達式括起來,使之成為一個整體,優(yōu)先得到運算。例如, ( $a -ge 0 ) -a ( $b -le 100 ) 邏輯表達式中的條件測試運算符優(yōu)先級高于“!” 運算符,“!” 運算符的優(yōu)先級高于“ -a”運算符,“-a”運算符高于 “-o”,而且圓括號( )高于 “-a”5特殊條件測試(1):表示不做任何事情,其退出值為0(2)true 表示總為真,其退出值總是0(3)false 表示總為假,其退出值是255case語句 case 字符串 in 模式字符串1) 命令 命令; 模式字符串2) 命令 命令; 模式字符

29、串n) 命令 命令; esac 注意 每個模式字符串后面可有一條或多條命令,最后一條命令必須以兩個分號(即;)結束模式字符串中可以使用通配符 如果一個模式字符串中包含多個模式,那么各模式之間應以豎線(|)隔開,表示各模式是“或”的關系,即只要給定字符串與其中一個模式相配,就會執(zhí)行其后的命令表 各模式字符串應是唯一的,不應重復出現(xiàn)。并且要合理安排它們的出現(xiàn)順序 case語句以關鍵字case開頭,以關鍵字esac(是case倒過來寫)結束 case的退出(返回)值是整個結構中最后執(zhí)行的那個命令的退出值。若沒有執(zhí)行任何命令,則退出值為零while語句 循環(huán)結構的語句有while語句、for語句 wh

30、ile 測試條件 do 命令表 done 測試條件部分除使用test命令或等價的方括號外,還可以是一組命令。根據(jù)其最后一個命令的退出值決定是否進入循環(huán)體執(zhí)行。for語句1值表方式格式一: for 變量 in 值表 do 命令表 done 可寫在一行: for 變量 in 值表 ;do 命令表;done格式二: for 變量 in 文件正則表達式 do 命令表 done格式三: for i in $* 或者 for i do do 命令表 命令表 done done2算術表達式方式格式: for (e1;e2;e3) do 命令表 done 可寫在一行 for ( e1;e2;e3) ; do

31、命令表;donee1, e2, e3是算術表達式。即: 先按算術運算規(guī)則計算表達式e1; 接著計算e2,如果e2值不為0,則執(zhí)行命令表中的命令,并且計算e3;然后重復,直至e2為0,退出循環(huán)break、continue、exit命令1break命令 break命令使程序從循環(huán)體中退出來。其語法格式是: break n 2continue命令 continue命令跳過循環(huán)體中在它之后的語句,回到本層循環(huán)的開頭,進行下一次循環(huán)。其語法格式是: continue n 3exit命令的功能是立即退出正在執(zhí)行的shell腳本,并設定退出值。其語法格式是: exit n select語句 select 語

32、句通常用于菜單的設計,它自動完成接收用戶輸入的整個過程,包括顯示一組菜單項以及讀入用戶的選擇。 select 語句的語法形式為: select identifierin word do 命令表 done如果in word這一部分被省略,那么參數(shù)identifier就以位置參數(shù)($1, $2, )作為給定的值。例4:ex18.sh#!/bin/bashPS3=Choice?select choice in query add delete update list exitdocase $choice inquery)echo Call query routinebreak;add)echo Call add

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論