Linuxshell程序設計_第1頁
Linuxshell程序設計_第2頁
Linuxshell程序設計_第3頁
Linuxshell程序設計_第4頁
Linuxshell程序設計_第5頁
已閱讀5頁,還剩77頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第第4 4章章 Linux shellLinux shell 程序設計程序設計 主要內容主要內容 shell的主要特點、類型、建立和執行的方式 bash變量的分類、定義形式及引用規則 各種控制語句的格式、功能及流程 bash中算術運算的使用 bash函數的構成及使用規則 bash中的內置命令shell的特點和主要版本 命令解釋程序 一種高級程序設計語言,它有變量,關鍵字,有各種控制語句,如if、case、while、for等語句,支持函數模塊,有自己的語法結構 shell的特點組合新命令 提供了文件名擴展字符 直接使用shell的內置命令 靈活地使用數據流 結構化的程序模塊 在后臺執行命令 可

2、配置的環境 高級的命令語言 shell的種類 (1)Bourne shell(簡稱sh) (2)C shell(簡稱csh) (3)Korn shell(簡稱ksh) (4)Bourne Again shell(即bash)簡單shell程序示例 【例4.1】 由三條簡單命令組成的shell程序(文件名為ex1)。 $ cat ex1datepwdcd .帶有控制結構的帶有控制結構的shellshell程序程序 【例4.2】 文件名為ex2 $ cat ex2#!/bin/bash# If no arguments, then listing the current directory.# O

3、therwise, listing each subdirectory.if test $# = 0then ls .else for i do ls -l $i | grep d donefishell腳本的執行 執行shell腳本的方式基本上有三種: (1)輸入定向到shell腳本 $ bash 腳本名腳本名 (2)以腳本名作為參數 其一般形式是: $ bash 腳本名腳本名 參數參數如果以目前shell(以表示)執行一個shell腳本,則可以使用如下簡便形式: $ 腳本名腳本名 參數參數 (3)將shell腳本的權限設置為可執行,然后在提示符下直接執行它。 $ chmod a+x ex2

4、 $ PATH=$PATH:. $ ex2注意,此時該腳本所在的目錄應被包含在命令搜索路徑(PATH)中命令歷史 語法格式是:history option arg 如果不帶任何參數,則history命令會顯示歷史命令的清單 如果history 后給出一個正整數(如50),就只顯示歷史表中的最后50行命令 如果history后給出一個文件名,就把它作為歷史文件名 常用的選項有: -a 在歷史文件中添加“新”歷史命令行。 -n 從歷史文件中讀取尚未讀入的歷史命令行,添加到當前歷史清單中。 -r 讀取歷史文件的內容,并把它作為當前的歷史命令。 -w 把當前的歷史寫到歷史文件中,覆蓋原有內容。 -c

5、刪除歷史清單中所有的項。 執行歷史命令 格 式 意 義 ! 重復上一條命令,也就是“!-1” !n 重新執行第n條歷史命令 !-n 重新執行倒數第n條歷史命令。!-1就等于! ! !string 重新執行以字符串string開頭的最近的歷史命令行。!?string? 重新執行最近的、包含字符串string的那條歷史命令 !# 到現在為止所輸入的整個命令行 執行歷史命令是命令替換之一,它以字符執行歷史命令是命令替換之一,它以字符“!”開頭、后開頭、后隨隨1 1個或多個字符來定義用戶所需的某種類型的歷史命令個或多個字符來定義用戶所需的某種類型的歷史命令 配置歷史命令環境 在默認方式下,bash使用

6、用戶主目錄下面的文件“.bash_history”來保存命令歷史 改變存放歷史命令的文件 $ HISTFILE=/home/mengqc/.myhistory 重新設定能夠保留的命令個數 $ HISTSIZE=600名稱補全 可以輸入目錄名或文件名的開頭部分,然后按Tab鍵,Linux根據輸入的字母查找以這些字母開頭的目錄或文件,并自動補全剩余的部分。 別名 一般語法格式為: alias name=value 如果沒有指定參數,將在標準輸出(屏幕)上顯示別名清單 定義別名時,往往用單引號將它代表的內容括起來,從而防止shell對其中的內容產生歧義,如對空格和特殊字符另作解釋取消別名 如果想取消

7、先前定義的別名,可使用如下命令: unalias name 可以一次將所有的別名都從別名表中刪除,使用如下命令: unalias -a 通配符(1) 1一般通配符 *(星號),它匹配任意字符的0次或多次出現 ?(問號),它匹配任意一個字符 (一對方括號),其中有一個字符組。其作用是匹配該字符組所限定的任何一個字符 !(驚嘆號),如果它緊跟在一對方括號的左方括號()之后,則表示不在一對方括號中所列出的字符 通配符(2) 2模式表達式 是那些包含一個或多個通配符的字 *(模式表)匹配給定模式表中“模式”的0次或多次出現,各模式之間以“”分開(下同) +(模式表)匹配給定模式表中“模式”的1次或多次

8、出現 ?(模式表)匹配模式表中任何一種“模式”的0次或1次出現 (模式表)僅匹配模式表中給定“模式”的一次出現 !(模式表)除給定模式表中的一個“模式”之外,可以匹配其他任何東西 引號1雙引號 由雙引號括起來的字符(除$、倒引號()和反斜線()外)均作為普通字符對待。2單引號 由單引號括起來的字符都作為普通字符出現3倒引號 倒引號括起來的字符串被shell解釋為命令行,在執行時,shell會先執行該命令行,并以它的標準輸出結果取代整個倒引號部分。 倒引號還可以嵌套使用。但應注意,嵌套使用時內層的倒引號必須用反斜線()將其轉義。 輸入/輸出重定向符(1) 三個標準文件,即標準輸入文件(stdin

9、),標準輸出文件(stdout)和標準出錯輸出文件(stderr)1輸入重定向符 一般形式是:命令 文件名 如:$ score 一般形式是:命令 文件名 如:$ who abc3輸出附加定向符 一般形式是:命令文件名 如:$ ps -l psfile輸入和輸出重新定向可以連在一起使用。例如: $ wc -l outfile輸入/輸出重定向符(2)4即時文件定向符即時文件的形式是: 命令 參數 標記符 輸入行 標記符注意:標記符要成對出現 例如: mail $1 文件名 命令 2 文件名例如:$gcc m1.c 2 errfile 標準輸出和標準錯誤輸出可以重定向到同一個文件,一般形式是: co

10、mmand $file等價于下面形式的命令: command file 2& 1注釋、管道線和后臺命令 1注釋 #!/bin/bash # If no arguments, then listing the current directory. # Otherwise, listing each subdirectory.2管道線 ls -l $HOME | wc l ls | grep m?.c | wc l 3后臺命令 $ gcc m1.c&命令執行操作符1順序執行 ;在執行時,以分號隔開的各條命令從左到右依次執行 pwd ; who | wc -l ; cd /usr/b

11、in2邏輯與 &命令1 & 命令2其功能是,先執行命令1,如果執行成功,才執行命令2;否則,若命令1執行不成功,則不執行命令2。 3邏輯或 |命令1 | 命令2其功能是,先執行命令1,如果執行不成功,則執行命令2;否則,若命令1執行成功,則不執行命令2。 成組命令(1)1 形式 以花括號括起來的全部命令可視為語法上的一條命令,出現在管道符的一邊。 $ echo “User Report for date . ”; who ; | pr 使用花括號時在格式上應注意:左括號 “ ”后面應有一個空格;右括號“”之前應有一個分號( ;)2( )形式 (echo Current dire

12、ctory is pwd . cd /home/mengqc ; ls -l ; cp m1 em1 & rm m1 cat em1) | pr 左括號 “(”后面不必有空格,右括號“)”之前不需有分號成組命令(2) 二者存在重要區別: 用花括號括起來的成組命令只是在本shell內執行命令表,不產生新的進程; 用圓括號括起來的成組命令是在新的子shell內執行,要建立新的子進程。 用戶定義的變量 1變量名是以字母或下線符打頭的字母、數字和下線符序列,并且大小寫字母意義不同。 2. 定義變量并賦值的一般形式是: 變量名=字符串3引用變量值 在變量名前面加上一個符號“$” 如果在賦給變量的

13、值中要含有空格、制表符或換行符,那么,就應該用雙引號把這個字符串括起來。 $ names=Zhangsan Lisi Wangwu $ echo $names 如果變量值須出現在長字符串的開頭或者中間,為了使變量名與其后的字符區分開,避免shell把它與其它字符混在一起視為一個新變量,則應該用花括號將該變量名括起來。例如, $ dir=/usr/meng $ cat $dirqc/m1.c4命令替換有兩種形式的命令替換:一種是使用倒引號引用命令,其一般形式是: 命令表另一種形式是: $(命令表) 如:$ dir=$(pwd) $ echo $(pwd ; cd /home/mengqc ; l

14、s -d)數組bash只提供一維數組,并且沒有限定數組的大小。類似與C語言,數組元素的下標由0開始編號。對數組元素賦值的一般形式是: 數組名下標值可以用declare命令顯式聲明一個數組,一般形式是: declare -a 數組名讀取數組元素值的一般格式是: $數組名下標定義一個數組并為其賦初值的一般形式是: 數組名=(值1 值2 值n) 其中,各個值之間以空格分開。若沒有給出數組元素的下標,則數組名表示下標為0的數組元素使用*或當作下標,則會以數組中所有元素取代*或變量引用 有效的變量引用表達式有以下形式:$name $name#pattern$name $name#pattern$name

15、n $name % pattern$name* $name % pattern$name $#$name:-word $#*$name:=word $# name $name:?word $# name*$name:+word $#name表達式$name表示變量name的值,若變量未定義,則用空值替換。表達式$name將被變量name的值替換。用花括號括起name,目的在于把變量名與后面的字符分隔開,避免出現混淆。替換后花括號被取消。$namen表示數組變量name中第n個元素的值。表達式$name*和$name都表示數組name中所有非空元素的值,每個元素的值用空格分開。如果用雙引號把它們

16、都括起來,那么二者的含義就有區別:對于$name*,它被擴展成一個詞(即字符串),這個詞由以空格分開的各個數組元素組成;對于$name,它被擴展成多個詞,每個數組元素是一個詞。如果數組name中沒有元素,則$name被擴展為空串。 表達式$name:-word、$name:=word、$name:+word、$name:?word的計算方法在4.7節中介紹表達式$name#pattern和$name#pattern 如果pattern(Shell模式)與name值的開頭匹配,那么name的值去掉匹配部分后的結果就是該表達式的值;否則, name的值就是該表達式的值。在第一種格式中,name值去

17、掉的部分是與pattern匹配的最少的部分;而第二種格式中,name值去掉的部分是與pattern匹配的最多的部分。表達式$name % pattern和$name % pattern 如果pattern與name值的末尾匹配,那么name的值中去掉匹配部分后的結果就是該表達式的值;否則,該表達式的值就是name的值。在第一種格式中,去掉的部分是最少的匹配部分;而第二種格式中,去掉的部分是最多的匹配部分。 表達式$#和$#* 它們的值分別是由$和$*返回的參數的個數。表達式$#namei 該表達式的值是數組name第i個元素值的長度(字符個數)。表達式$#nane*和$#name 它們的值都是

18、數組name中已經設置的元素的個數。輸入命令 輸入命令:read 可以利用read命令從鍵盤上讀取數據,然后賦給指定的變量。read命令的一般格式是:read 變量1 變量2 變量個數與給定數據個數相同,則依次對應賦值 變量個數少于數據個數,則從左至右對應賦值,但最后一個變量被賦予剩余的所有數據。 變量個數多于給定數據個數,則依次對應賦值,而沒有數據與之對應的變量取空串輸出命令 echo命令 顯示其后的變量值或者直接顯示它后面的字符串 如果echo命令帶有選項“-e”,那么在其后的參數中可以有以下轉義字符: a b c e f n r t v m xm 【例4.6】 特洛伊木馬shell腳本示

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

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

21、構成的數字串。$ 由當前shell設置的執行標志名組成的字符串。$* 表示在命令行中實際給出的所有實參字符串,它并不僅限于9個實參。$ 它與$*基本功能相同,即表示在命令行中給出的所有實參。但“$”與“$*”不同。環境變量(1)常用的環境變量 HOME:用戶主目錄的全路徑名 LOGNAME:即你的注冊名,由Linux自動設置 MAIL:你的系統信箱的路徑 PATH:shell從中查找命令的目錄列表。可以設置它, 如:PATH=$PATH:$HOME/bin PS1:shell的主提示符。 bash默認的主提示符一般為“s-v$ ”。其中,s表示shell的名稱;v表示bash的版本號如:PS1

22、=Enter Command PWD:你當前工作目錄的路徑 SHELL:你當前使用的shell TERM: 你的終端類型環境變量(2)2使用環境變量 如果要使用環境變量或其它shell變量的值,必須在變量名之前加上一個“$”符號,不能直接使用變量名。 如:cd $HOME3刪除環境變量 $ unset NAME環境文件 bash的環境文件包括.bash_profile文件、.bashrc文件、.bash_logout文件等。 在.bash_profile中,設置了環境變量和文件掩碼(umask) 名為.bashrc的腳本,每次啟動bash時便會執行它。它只含有針對bash的命令,可以用來設置別

23、名。.bashrc在.bash_profile之后執行 .bash_logout,它僅在退出注冊的時候運行 export語句一個進程在自己的環境中定義的變量是局部變量,僅限于自身范圍,不能自動傳給其子進程。就是說,子進程只能繼承父進程的公用區和轉出區中的數據,而每個進程的數據區和棧區是私有的,不能繼承。為了使其后的各個子進程能繼承父進程中定義的變量,就必須用export(轉出)命令將這些變量送入進程轉出區。export命令的一般使用形式是:export 變量名 環境變量的設置和顯示 設置變量要用如下形式:變量名=值 如果變量值的字符串中帶有空格等特殊字符,需要用引號把整個字符串括起來。 例如:

24、$ PS1=OK 利用export命令將這些變量輸出,使它們成為公用量。如: export HOME HZ LOGNAME TERM 可以利用env命令列出所有的環境變量,包括本進程及以前的“祖先進程”所輸出的變量set命令set命令的功能主要有三個: 顯示迄今為止所定義的全部變量,包括局部量和公用量; 用來設定位置參數的值; 改變執行shell腳本時的選項設定,可以使用戶改變shell的功能。設置標志的一般形式是: set -標志 例如:set -x關閉標志的一般形式是: set +標志 例如:set +x參數置換變量 參數置換變量是另一種為變量賦值的方式,其一般形式是: 變量2=$ 變量1

25、 op 字符串其中,op表示操作符,它可以是下列四個操作符之一: : : = : + : ?變量2的值取決于變量1(參數)是否為空串、利用哪個操作符以及字符串的取值。在操作符的前后不留空格。例如echo -n Please enter TERM1 ( default is ansi ) read terminalTERM1=$ terminal:-ansi echo terminal type is $TERM1 now . echo terminal=$terminal 格 式 var1為空 var1不為空var2=$ var1:-string var2=string,var1不變 var2

26、=$var1,var1不變 var2=$var1:=string var2=stringvar1=stringvar2=$var1var1不變var2=$var1:+string var2為空,var1不變var2=string,var1不變var2=$var1:?string 輸出格式:腳本名: var1:string并退出shellvar2不變 var2=$var1,var1不變 四種參數置換變量的格式與功能算術運算(1)bash中執行整數算術運算的命令是let,其語法格式為: let arg 其中arg是單獨的算術表達式。它使用C語言中表達式的語法、優先級和結合性。所有整型運算符都得到支

27、持,此外,還提供了方冪運算符“*”。 在算術表達式中直接利用名稱訪問命名的參數,不要前面帶有“$”符號let 命令的替代表示形式是: (算術表達式)例如: let j=i*6+2等價于: (j=i*6+2)如果表達式的值是非0,那么返回的狀態值是0;否則,返回的狀態值是1。算術運算(2) 當表達式中有shell的特殊字符時,必須用雙引號將其括起來。例如 let val=a|b 只有使用 $(算術表達式) 形式才能返回表達式的值if語句(1) if語句用于條件控制結構中,其一般格式為: if 測試條件 then 命令1 else 命令2 fi 其中,if、then、else和fi是關鍵字。例如:

28、 if test -f $1 then echo $1 is an ordinary file . else echo $1 is not an ordinary file . fiif語句(2) if語句中else部分可以缺省。例如, if test -f $1 then echo $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 n

29、either a file nor a directory .fiifif的語句的更一般形式是:的語句的更一般形式是: if if 命令表命令表1 1 then then 命令表命令表2 2 else else 命令表命令表3 3 fi fi【例例4.114.11】 if if語句的應用語句的應用$ cat ex10# if user has logged in the system# then , copy a file to his or her file# else , display an error informationecho Type in the user name . re

30、ad userif grep $user /etc/passwd /tmp/null who | grep $userthen echo $user has logged in the system . cp /tmp/null tmp1 rm /tmp/nullelse echo $user has not logged in the system .fi條件測試 條件測試有三種常用形式:一種是用test 命令,如上所示。另一種是用一對方括號將測試條件括起來。這兩種形式是完全等價的。例如,測試位置參數$1是否是已存在的普通文件,可寫為: test -f $1也完全可寫成: -f $1 第三種

31、形式是: 條件表達式 test命令可以和多種系統運算符一起使用。這些運算符可以分為四類:文件測試運算符、字符串測試運算符、數值測試運算符和邏輯運算符。 參 數 功 能 -r 文件名 若文件存在并且是用戶可讀的,則測試條件為真 -w 文件名 若文件存在并且是用戶可寫的,則測試條件為真 -x 文件名 若文件存在并且是用戶可執行的,則測試條件為真-f 文件名 若文件存在并且是普通文件,則測試條件為真 -d 文件名 若文件存在并且是目錄文件,則測試條件為真 -p 文件名 若文件存在并且是命名的FIFO文件,則測試條件為真-b 文件名 若文件存在并且是塊設備文件,則測試條件為真 -c 文件名 若文件存在

32、并且是字符設備文件,則測試條件為真 -s 文件名 若文件存在并且文件的長度大于0,則測試條件為真 -t 文件描述字 若文件被打開且其文件描述字是與終端設備相關的,則測試條件為真。默認的“文件描述字”是1 1 1有關文件方面的測試有關文件方面的測試 參 數 功 能 -z s1如果字符串s1的長度為0,則測試條件為真。 -n s1如果字符串s1的長度大于0,則測試條件為真。 s1如果字符串s1不是空字符串,則測試條件為真。 s1 = s2如果s1等于s2,則測試條件為真。“”也可以用“”代替。在“”前后應有空格。 s1 != s2如果s1不等于s2,則測試條件為真。 s1 s2如果按字典順序s1在

33、s2之后,則測試條件為真2 2有關字符串方面的測試有關字符串方面的測試 參 數 功 能 n1 -eq n2如果整數n1等于n2,則測試條件為真 n1 -ne n2 如果整數n1不等于n2,則測試條件為真 n1 -lt n2 如果n1小于n2,則測試條件為真 n1 -le n2如果n1小于或等于n2,則測試條件為真 n1 -gt n2如果n1大于n2,則測試條件為真 n1 -ge n2如果n1大于或等于n2,則測試條件為真3 3有關數值方面的測試有關數值方面的測試 4邏輯運算符 上述測試條件可以在if 語句或循環語句中單個使用,也可以通過邏輯運算符把它們組合起來使用。可以在測試語句中使用的邏輯運

34、算符有: ! 邏輯非( NOT ),它放在任意邏輯表達式之前,使原來為真的表達式變為假,使原來為假的變為真。例如, ! -r $1 , ! test -r $1等。 - a 邏輯與( AND ),它放在兩個邏輯表達式中間,僅當兩個表達式都為真時,結果才為真。例如, - f $myfile - a - r $myfile - o 邏輯或( OR ),它放在兩個邏輯表達式中間,其中只要有一個表達式為真,結果就為真。例如, $a -ge 0 -o $b -le 100 (表達式) 圓括號,它可以把一個邏輯表達式括起來,使之成為一個整體,優先得到運算。例如, ( $a -ge 0 ) -a ( $b

35、-le 100 ) 邏輯表達式中的條件測試運算符優先級高于“!” 運算符,“!” 運算符的優先級高于“ -a”運算符,“-a”運算符高于 “-o”,而且圓括號( )高于 “-a”5特殊條件測試(1) :表示不做任何事情,其退出值為0。(2)true 表示總為真,其退出值總是0。(3)false 表示總為假,其退出值是255。case語句 case語句允許進行多重條件選擇。其一般語法形式是: case 字符串 in 模式字符串1) 命令 命令; 模式字符串2) 命令 命令; 模式字符串n) 命令 命令; esac 在使用case語句時應注意: 每個模式字符串后面可有一條或多條命令,其最后一條命令

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

37、 測試條件 do 命令表 done 測試條件部分除使用test命令或等價的方括號外,還可以是一組命令。根據其最后一個命令的退出值決定是否進入循環體執行。4.9.5 until4.9.5 until語句語句 untiluntil語句的一般形式是:語句的一般形式是: until until 測試條件測試條件 dodo 命令表命令表 donedone 它與它與whilewhile語句很相似,只是測試條件不同:當測試條語句很相似,只是測試條件不同:當測試條件為假時,才進入循環體,直至測試條件為真時終止件為假時,才進入循環體,直至測試條件為真時終止循環。循環。4.9.6 for4.9.6 for語句語句

38、 其使用方式主要有兩種:一種是值表方式,另一種是算術其使用方式主要有兩種:一種是值表方式,另一種是算術表達式方式。表達式方式。1 1值表方式值表方式 其一般格式是:其一般格式是: for for 變量變量 in in 值表值表 ;do do 命令表;命令表;donedone 根據循環變量的取值方式,其使用格式可分為三種:根據循環變量的取值方式,其使用格式可分為三種:格式一:格式一: for for 變量變量 in in 值表值表 dodo 命令表命令表 donedone格式二:格式二: for for 變量變量 in in 文件正則表達式文件正則表達式 dodo 命令表命令表 donedone

39、格式三:格式三: for i in $for i in $* * 或者或者 for i for i do do do do 命令表命令表 命令表命令表 done donedone done2 2算術表達式方式算術表達式方式 其一般格式是:其一般格式是: for ( e1;e2;e3) ; do for ( e1;e2;e3) ; do 命令表;命令表;donedone 或者或者 for (e1;e2;e3)for (e1;e2;e3) do do 命令表命令表 donedone其中,其中,e1, e2, e3e1, e2, e3是算術表達式。它的執行過程與是算術表達式。它的執行過程與C C語言

40、中語言中forfor語句相似,即:語句相似,即: 先按算術運算規則計算表達式先按算術運算規則計算表達式e1e1; 接著計算接著計算e2e2,如果,如果e2e2值不為值不為0 0,則執行命令表中的命令,則執行命令表中的命令,并且計算并且計算e3e3;然后重復,直至;然后重復,直至e2e2為為0 0,退出循環。,退出循環。 4.9.7 break4.9.7 break命令和命令和continuecontinue命令命令1 1breakbreak命令命令 breakbreak命令使程序從循環體中退出來。其語法格式是:命令使程序從循環體中退出來。其語法格式是: break n break n 2 2c

41、ontinuecontinue命令命令 continuecontinue命令跳過循環體中在它之后的語句,回到本層命令跳過循環體中在它之后的語句,回到本層循環的開頭,進行下一次循環。其語法格式是:循環的開頭,進行下一次循環。其語法格式是: continue n continue n 4.9.8 exit4.9.8 exit命令命令 exitexit命令的功能是立即退出正在執行的命令的功能是立即退出正在執行的shellshell腳本,并設腳本,并設定退出值。其語法格式是:定退出值。其語法格式是: exit n exit n 4.9.9 select4.9.9 select語句語句 select s

42、elect 語句通常用于菜單的設計,它自動完成接收用戶語句通常用于菜單的設計,它自動完成接收用戶輸入的整個過程,包括顯示一組菜單項以及讀入用戶的選輸入的整個過程,包括顯示一組菜單項以及讀入用戶的選擇。擇。 select select 語句的語法形式為:語句的語法形式為: select identifierin wordselect identifierin word do do 命令表命令表 donedone如果如果in wordin word這一部分被省略,那么參數這一部分被省略,那么參數identifieridentifier就以就以位置參數(位置參數($1, $2, $1, $2, )作

43、為給定的值。)作為給定的值。4.10 4.10 函數函數 在在shellshell腳本中可以定義并使用函數。其定義格式為:腳本中可以定義并使用函數。其定義格式為: functionfunction函數名函數名( )( ) 命令表命令表 函數應先定義,后使用。調用函數時,直接利用函數名,函數應先定義,后使用。調用函數時,直接利用函數名,如如showfileshowfile,不必帶圓括號,不必帶圓括號 shellshell腳本與函數間的參數傳遞可利用位置參數和變量直腳本與函數間的參數傳遞可利用位置參數和變量直接傳遞接傳遞 通常,函數中的最后一個命令執行之后,就退出被調函數。通常,函數中的最后一個命

44、令執行之后,就退出被調函數。也可利用也可利用returnreturn命令立即退出函數,其語法格式是:命令立即退出函數,其語法格式是: return n return n 4.11 4.11 作作 業業 控控 制制 執行命令執行命令set -o monitorset -o monitor,則交互式,則交互式shellshell就實就實施作業管理。作業管理的命令有施作業管理。作業管理的命令有jobsjobs,killkill,bgbg,fgfg和和waitwait。 4.11.1 jobs4.11.1 jobs命令命令 不帶參數時,可列出當前尚未完成的作業。例如:不帶參數時,可列出當前尚未完成的作

45、業。例如: $ jobs$ jobs 2 +Done 2 +Done who whowc -cdwc -cd 1 -Stopped(SIGTTOU) man ls& 1 -Stopped(SIGTTOU) man ls& 4.11.2 kill4.11.2 kill命令命令 使用使用killkill命令可以向指定的進程發送命令可以向指定的進程發送TERMTERM(終止)信(終止)信號或者指定的信號。號或者指定的信號。 其中一些信號可以使作業中止運行。其中一些信號可以使作業中止運行。 例如:例如:kill -9 1893kill -9 1893 信號可以由信號號碼(信號可以由信號

46、號碼(sigsig)或者信號名()或者信號名(signamesigname)指定。利用指定。利用kill -lkill -l命令可以列出全部信號名。命令可以列出全部信號名。4.11.3 bg4.11.3 bg和和fgfg命令命令 bgbg命令可以把前臺作業切換成后臺作業命令可以把前臺作業切換成后臺作業 其語法格式是:其語法格式是: bg job bg job fgfg命令可以把后臺作業切換成前臺作業命令可以把后臺作業切換成前臺作業 其語法格式是:其語法格式是: fg jobfg job 僅當作業控制被激活,這些命令才起作用僅當作業控制被激活,這些命令才起作用 4.12 shell4.12 sh

47、ell內置命令內置命令 這些命令構造在這些命令構造在shellshell內部,從而在內部,從而在shellshell進程內執行。已在進程內執行。已在前面介紹過的內置命令:前面介紹過的內置命令: :,:, . filename. filename, break n , continue n , cd , break n , continue n , cd , echo, exit n , export, pwd, read, return n , echo, exit n , export, pwd, read, return n , set, shift n , test, bg, fg, k

48、illset, shift n , test, bg, fg, kill等等 。 1 1evaleval命令命令 格式是:格式是: eval arg eval arg 可以利用別的命令行作為自己的參數(可以利用別的命令行作為自己的參數(argarg),進行相應的變),進行相應的變量或命令替換,并把替換結果結合成一個新的命令行,然后量或命令替換,并把替換結果結合成一個新的命令行,然后讀取并加以執行。讀取并加以執行。 #!/bin/bashgetc()stty rawtmp=dd bs=1 count=1 2/dev/nulleval $1= $tmpstty cookedpress_any_ke

49、y()echo -n Strike any key to continuegetc anycharecho -n Enter a character:getc charechoecho You entered $char press_any_key charecho2 2execexec命令命令 格式是:格式是: exec arg exec arg 在本在本shellshell中執行由參數中執行由參數argarg指定的命令,并不創建新進程指定的命令,并不創建新進程 3 3hashhash命令命令 格式是:格式是: hash -r name hash -r name 可以確定并記住由可以確定并記

50、住由namename指定的每個命令在搜索路徑中的位指定的每個命令在搜索路徑中的位置。置。 4 4readonlyreadonly命令命令 格式是:格式是: readonly name readonly name 標記給定的標記給定的namename(變量名)是只讀的,以后不能通過賦值(變量名)是只讀的,以后不能通過賦值語句改變其值語句改變其值 5 5traptrap命令命令 用來設定接收到某個信號所完成的動作,忽略某個信號的影用來設定接收到某個信號所完成的動作,忽略某個信號的影響或者恢復該信號產生時系統預設的動作。響或者恢復該信號產生時系統預設的動作。 其格式是:其格式是: trap arg

51、n trap arg n 為某些信號另外指定處理方式。例如:為某些信號另外指定處理方式。例如: trap rm - f $temp ; exit 0 1 2 3 15trap rm - f $temp ; exit 0 1 2 3 15如果如果argarg是空串,如是空串,如 : : trap 2 trap 2 那么那么, ,信號信號2 2就被就被shellshell和它引用的命令忽略。和它引用的命令忽略。如果缺省如果缺省argarg,則把所有陷入信號,則把所有陷入信號n n的動作恢復成原來系統的動作恢復成原來系統設置的動作。如設置的動作。如: : trap 1 2 trap 1 2 如果如果

52、traptrap命令后面沒有任何參數,則顯示與每個信號相關命令后面沒有任何參數,則顯示與每個信號相關的命令表。的命令表。6 6typetype命令命令 格式是:格式是: type name type name 功能是,對于每一個功能是,對于每一個namename,如果作為命令名,它是如何被,如果作為命令名,它是如何被解釋的,如內置命令、一般命令搜索路徑等。解釋的,如內置命令、一般命令搜索路徑等。 7 7unsetunset命令命令 格式是:格式是:unset name unset name 刪除由刪除由namename指定的相應變量或函數。指定的相應變量或函數。 應注意,變量應注意,變量PAT

53、HPATH,PS1PS1,PS2PS2,MAILCHECKMAILCHECK和和IFSIFS不能被刪不能被刪除,即不能受除,即不能受unsetunset的作用。的作用。 8 8umaskumask命令命令 格式是格式是umask -S mask umask -S mask 將用戶文件創建掩碼設置為將用戶文件創建掩碼設置為maskmask的值。的值。9 9waitwait命令命令 格式是:格式是:wait n wait n 等待由等待由n n(進程(進程 IDID)指定的進程終止,并報告終止狀態。)指定的進程終止,并報告終止狀態。 4.13 shell4.13 shell腳本調試腳本調試 通常采用自底向上的方法,即:先搞清楚要腳本做什么,通常采用自

溫馨提示

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

評論

0/150

提交評論