




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第4 4章章 Linux shellLinux shell 程序設(shè)計(jì)程序設(shè)計(jì) 主要內(nèi)容主要內(nèi)容 shell的主要特點(diǎn)、類(lèi)型、建立和執(zhí)行的方式 bash變量的分類(lèi)、定義形式及引用規(guī)則 各種控制語(yǔ)句的格式、功能及流程 bash中算術(shù)運(yùn)算的使用 bash函數(shù)的構(gòu)成及使用規(guī)則 bash中的內(nèi)置命令shell的特點(diǎn)和主要版本 命令解釋程序 一種高級(jí)程序設(shè)計(jì)語(yǔ)言,它有變量,關(guān)鍵字,有各種控制語(yǔ)句,如if、case、while、for等語(yǔ)句,支持函數(shù)模塊,有自己的語(yǔ)法結(jié)構(gòu) shell的特點(diǎn)組合新命令 提供了文件名擴(kuò)展字符 直接使用shell的內(nèi)置命令 靈活地使用數(shù)據(jù)流 結(jié)構(gòu)化的程序模塊 在后臺(tái)執(zhí)行命令 可
2、配置的環(huán)境 高級(jí)的命令語(yǔ)言 shell的種類(lèi) (1)Bourne shell(簡(jiǎn)稱(chēng)sh) (2)C shell(簡(jiǎn)稱(chēng)csh) (3)Korn shell(簡(jiǎn)稱(chēng)ksh) (4)Bourne Again shell(即bash)簡(jiǎn)單shell程序示例 【例4.1】 由三條簡(jiǎn)單命令組成的shell程序(文件名為ex1)。 $ cat ex1datepwdcd .帶有控制結(jié)構(gòu)的帶有控制結(jié)構(gòu)的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腳本的執(zhí)行 執(zhí)行shell腳本的方式基本上有三種: (1)輸入定向到shell腳本 $ bash 腳本名腳本名 (2)以腳本名作為參數(shù) 其一般形式是: $ bash 腳本名腳本名 參數(shù)參數(shù)如果以目前shell(以表示)執(zhí)行一個(gè)shell腳本,則可以使用如下簡(jiǎn)便形式: $ 腳本名腳本名 參數(shù)參數(shù) (3)將shell腳本的權(quán)限設(shè)置為可執(zhí)行,然后在提示符下直接執(zhí)行它。 $ chmod a+x ex2
4、 $ PATH=$PATH:. $ ex2注意,此時(shí)該腳本所在的目錄應(yīng)被包含在命令搜索路徑(PATH)中命令歷史 語(yǔ)法格式是:history option arg 如果不帶任何參數(shù),則history命令會(huì)顯示歷史命令的清單 如果history 后給出一個(gè)正整數(shù)(如50),就只顯示歷史表中的最后50行命令 如果history后給出一個(gè)文件名,就把它作為歷史文件名 常用的選項(xiàng)有: -a 在歷史文件中添加“新”歷史命令行。 -n 從歷史文件中讀取尚未讀入的歷史命令行,添加到當(dāng)前歷史清單中。 -r 讀取歷史文件的內(nèi)容,并把它作為當(dāng)前的歷史命令。 -w 把當(dāng)前的歷史寫(xiě)到歷史文件中,覆蓋原有內(nèi)容。 -c
5、刪除歷史清單中所有的項(xiàng)。 執(zhí)行歷史命令 格 式 意 義 ! 重復(fù)上一條命令,也就是“!-1” !n 重新執(zhí)行第n條歷史命令 !-n 重新執(zhí)行倒數(shù)第n條歷史命令。!-1就等于! ! !string 重新執(zhí)行以字符串string開(kāi)頭的最近的歷史命令行。!?string? 重新執(zhí)行最近的、包含字符串string的那條歷史命令 !# 到現(xiàn)在為止所輸入的整個(gè)命令行 執(zhí)行歷史命令是命令替換之一,它以字符執(zhí)行歷史命令是命令替換之一,它以字符“!”開(kāi)頭、后開(kāi)頭、后隨隨1 1個(gè)或多個(gè)字符來(lái)定義用戶(hù)所需的某種類(lèi)型的歷史命令個(gè)或多個(gè)字符來(lái)定義用戶(hù)所需的某種類(lèi)型的歷史命令 配置歷史命令環(huán)境 在默認(rèn)方式下,bash使用
6、用戶(hù)主目錄下面的文件“.bash_history”來(lái)保存命令歷史 改變存放歷史命令的文件 $ HISTFILE=/home/mengqc/.myhistory 重新設(shè)定能夠保留的命令個(gè)數(shù) $ HISTSIZE=600名稱(chēng)補(bǔ)全 可以輸入目錄名或文件名的開(kāi)頭部分,然后按Tab鍵,Linux根據(jù)輸入的字母查找以這些字母開(kāi)頭的目錄或文件,并自動(dòng)補(bǔ)全剩余的部分。 別名 一般語(yǔ)法格式為: alias name=value 如果沒(méi)有指定參數(shù),將在標(biāo)準(zhǔn)輸出(屏幕)上顯示別名清單 定義別名時(shí),往往用單引號(hào)將它代表的內(nèi)容括起來(lái),從而防止shell對(duì)其中的內(nèi)容產(chǎn)生歧義,如對(duì)空格和特殊字符另作解釋取消別名 如果想取消
7、先前定義的別名,可使用如下命令: unalias name 可以一次將所有的別名都從別名表中刪除,使用如下命令: unalias -a 通配符(1) 1一般通配符 *(星號(hào)),它匹配任意字符的0次或多次出現(xiàn) ?(問(wèn)號(hào)),它匹配任意一個(gè)字符 (一對(duì)方括號(hào)),其中有一個(gè)字符組。其作用是匹配該字符組所限定的任何一個(gè)字符 !(驚嘆號(hào)),如果它緊跟在一對(duì)方括號(hào)的左方括號(hào)()之后,則表示不在一對(duì)方括號(hào)中所列出的字符 通配符(2) 2模式表達(dá)式 是那些包含一個(gè)或多個(gè)通配符的字 *(模式表)匹配給定模式表中“模式”的0次或多次出現(xiàn),各模式之間以“”分開(kāi)(下同) +(模式表)匹配給定模式表中“模式”的1次或多次
8、出現(xiàn) ?(模式表)匹配模式表中任何一種“模式”的0次或1次出現(xiàn) (模式表)僅匹配模式表中給定“模式”的一次出現(xiàn) !(模式表)除給定模式表中的一個(gè)“模式”之外,可以匹配其他任何東西 引號(hào)1雙引號(hào) 由雙引號(hào)括起來(lái)的字符(除$、倒引號(hào)()和反斜線(xiàn)()外)均作為普通字符對(duì)待。2單引號(hào) 由單引號(hào)括起來(lái)的字符都作為普通字符出現(xiàn)3倒引號(hào) 倒引號(hào)括起來(lái)的字符串被shell解釋為命令行,在執(zhí)行時(shí),shell會(huì)先執(zhí)行該命令行,并以它的標(biāo)準(zhǔn)輸出結(jié)果取代整個(gè)倒引號(hào)部分。 倒引號(hào)還可以嵌套使用。但應(yīng)注意,嵌套使用時(shí)內(nèi)層的倒引號(hào)必須用反斜線(xiàn)()將其轉(zhuǎn)義。 輸入/輸出重定向符(1) 三個(gè)標(biāo)準(zhǔn)文件,即標(biāo)準(zhǔn)輸入文件(stdin
9、),標(biāo)準(zhǔn)輸出文件(stdout)和標(biāo)準(zhǔn)出錯(cuò)輸出文件(stderr)1輸入重定向符 一般形式是:命令 文件名 如:$ score 一般形式是:命令 文件名 如:$ who abc3輸出附加定向符 一般形式是:命令文件名 如:$ ps -l psfile輸入和輸出重新定向可以連在一起使用。例如: $ wc -l outfile輸入/輸出重定向符(2)4即時(shí)文件定向符即時(shí)文件的形式是: 命令 參數(shù) 標(biāo)記符 輸入行 標(biāo)記符注意:標(biāo)記符要成對(duì)出現(xiàn) 例如: mail $1 文件名 命令 2 文件名例如:$gcc m1.c 2 errfile 標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出可以重定向到同一個(gè)文件,一般形式是: co
10、mmand $file等價(jià)于下面形式的命令: command file 2& 1注釋、管道線(xiàn)和后臺(tái)命令 1注釋 #!/bin/bash # If no arguments, then listing the current directory. # Otherwise, listing each subdirectory.2管道線(xiàn) ls -l $HOME | wc l ls | grep m?.c | wc l 3后臺(tái)命令 $ gcc m1.c&命令執(zhí)行操作符1順序執(zhí)行 ;在執(zhí)行時(shí),以分號(hào)隔開(kāi)的各條命令從左到右依次執(zhí)行 pwd ; who | wc -l ; cd /usr/b
11、in2邏輯與 &命令1 & 命令2其功能是,先執(zhí)行命令1,如果執(zhí)行成功,才執(zhí)行命令2;否則,若命令1執(zhí)行不成功,則不執(zhí)行命令2。 3邏輯或 |命令1 | 命令2其功能是,先執(zhí)行命令1,如果執(zhí)行不成功,則執(zhí)行命令2;否則,若命令1執(zhí)行成功,則不執(zhí)行命令2。 成組命令(1)1 形式 以花括號(hào)括起來(lái)的全部命令可視為語(yǔ)法上的一條命令,出現(xiàn)在管道符的一邊。 $ echo “User Report for date . ”; who ; | pr 使用花括號(hào)時(shí)在格式上應(yīng)注意:左括號(hào) “ ”后面應(yīng)有一個(gè)空格;右括號(hào)“”之前應(yīng)有一個(gè)分號(hào)( ;)2( )形式 (echo Current dire
12、ctory is pwd . cd /home/mengqc ; ls -l ; cp m1 em1 & rm m1 cat em1) | pr 左括號(hào) “(”后面不必有空格,右括號(hào)“)”之前不需有分號(hào)成組命令(2) 二者存在重要區(qū)別: 用花括號(hào)括起來(lái)的成組命令只是在本shell內(nèi)執(zhí)行命令表,不產(chǎn)生新的進(jìn)程; 用圓括號(hào)括起來(lái)的成組命令是在新的子shell內(nèi)執(zhí)行,要建立新的子進(jìn)程。 用戶(hù)定義的變量 1變量名是以字母或下線(xiàn)符打頭的字母、數(shù)字和下線(xiàn)符序列,并且大小寫(xiě)字母意義不同。 2. 定義變量并賦值的一般形式是: 變量名=字符串3引用變量值 在變量名前面加上一個(gè)符號(hào)“$” 如果在賦給變量的
13、值中要含有空格、制表符或換行符,那么,就應(yīng)該用雙引號(hào)把這個(gè)字符串括起來(lái)。 $ names=Zhangsan Lisi Wangwu $ echo $names 如果變量值須出現(xiàn)在長(zhǎng)字符串的開(kāi)頭或者中間,為了使變量名與其后的字符區(qū)分開(kāi),避免shell把它與其它字符混在一起視為一個(gè)新變量,則應(yīng)該用花括號(hào)將該變量名括起來(lái)。例如, $ dir=/usr/meng $ cat $dirqc/m1.c4命令替換有兩種形式的命令替換:一種是使用倒引號(hào)引用命令,其一般形式是: 命令表另一種形式是: $(命令表) 如:$ dir=$(pwd) $ echo $(pwd ; cd /home/mengqc ; l
14、s -d)數(shù)組bash只提供一維數(shù)組,并且沒(méi)有限定數(shù)組的大小。類(lèi)似與C語(yǔ)言,數(shù)組元素的下標(biāo)由0開(kāi)始編號(hào)。對(duì)數(shù)組元素賦值的一般形式是: 數(shù)組名下標(biāo)值可以用declare命令顯式聲明一個(gè)數(shù)組,一般形式是: declare -a 數(shù)組名讀取數(shù)組元素值的一般格式是: $數(shù)組名下標(biāo)定義一個(gè)數(shù)組并為其賦初值的一般形式是: 數(shù)組名=(值1 值2 值n) 其中,各個(gè)值之間以空格分開(kāi)。若沒(méi)有給出數(shù)組元素的下標(biāo),則數(shù)組名表示下標(biāo)為0的數(shù)組元素使用*或當(dāng)作下標(biāo),則會(huì)以數(shù)組中所有元素取代*或變量引用 有效的變量引用表達(dá)式有以下形式:$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表達(dá)式$name表示變量name的值,若變量未定義,則用空值替換。表達(dá)式$name將被變量name的值替換。用花括號(hào)括起name,目的在于把變量名與后面的字符分隔開(kāi),避免出現(xiàn)混淆。替換后花括號(hào)被取消。$namen表示數(shù)組變量name中第n個(gè)元素的值。表達(dá)式$name*和$name都表示數(shù)組name中所有非空元素的值,每個(gè)元素的值用空格分開(kāi)。如果用雙引號(hào)把它們
16、都括起來(lái),那么二者的含義就有區(qū)別:對(duì)于$name*,它被擴(kuò)展成一個(gè)詞(即字符串),這個(gè)詞由以空格分開(kāi)的各個(gè)數(shù)組元素組成;對(duì)于$name,它被擴(kuò)展成多個(gè)詞,每個(gè)數(shù)組元素是一個(gè)詞。如果數(shù)組name中沒(méi)有元素,則$name被擴(kuò)展為空串。 表達(dá)式$name:-word、$name:=word、$name:+word、$name:?word的計(jì)算方法在4.7節(jié)中介紹表達(dá)式$name#pattern和$name#pattern 如果pattern(Shell模式)與name值的開(kāi)頭匹配,那么name的值去掉匹配部分后的結(jié)果就是該表達(dá)式的值;否則, name的值就是該表達(dá)式的值。在第一種格式中,name值去
17、掉的部分是與pattern匹配的最少的部分;而第二種格式中,name值去掉的部分是與pattern匹配的最多的部分。表達(dá)式$name % pattern和$name % pattern 如果pattern與name值的末尾匹配,那么name的值中去掉匹配部分后的結(jié)果就是該表達(dá)式的值;否則,該表達(dá)式的值就是name的值。在第一種格式中,去掉的部分是最少的匹配部分;而第二種格式中,去掉的部分是最多的匹配部分。 表達(dá)式$#和$#* 它們的值分別是由$和$*返回的參數(shù)的個(gè)數(shù)。表達(dá)式$#namei 該表達(dá)式的值是數(shù)組name第i個(gè)元素值的長(zhǎng)度(字符個(gè)數(shù))。表達(dá)式$#nane*和$#name 它們的值都是
18、數(shù)組name中已經(jīng)設(shè)置的元素的個(gè)數(shù)。輸入命令 輸入命令:read 可以利用read命令從鍵盤(pán)上讀取數(shù)據(jù),然后賦給指定的變量。read命令的一般格式是:read 變量1 變量2 變量個(gè)數(shù)與給定數(shù)據(jù)個(gè)數(shù)相同,則依次對(duì)應(yīng)賦值 變量個(gè)數(shù)少于數(shù)據(jù)個(gè)數(shù),則從左至右對(duì)應(yīng)賦值,但最后一個(gè)變量被賦予剩余的所有數(shù)據(jù)。 變量個(gè)數(shù)多于給定數(shù)據(jù)個(gè)數(shù),則依次對(duì)應(yīng)賦值,而沒(méi)有數(shù)據(jù)與之對(duì)應(yīng)的變量取空串輸出命令 echo命令 顯示其后的變量值或者直接顯示它后面的字符串 如果echo命令帶有選項(xiàng)“-e”,那么在其后的參數(shù)中可以有以下轉(zhuǎn)義字符: 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位置參數(shù)1位置參數(shù)及其引用 位置變量的名稱(chēng)很特別,分別是0,1,2, 命令行實(shí)參與腳本中位置變量的對(duì)應(yīng)關(guān)系如下所示: 引用它們的方式依次是$0, $1, $2, , $9, $10, $11等。 其中,$0始終表示命令名或shell腳本名。 位置變量不能通過(guò)一般
20、賦值的方式直接賦值 通過(guò)命令行上對(duì)應(yīng)位置的實(shí)參傳值 2用set命令為位置參數(shù)賦值移動(dòng)位置參數(shù) 每執(zhí)行一次shift命令,就把命令行上的實(shí)參向左移一位,即相當(dāng)于位置參數(shù)向右移動(dòng)一個(gè)位置。 shift命令不能將$0移走,所以經(jīng)shift右移位置參數(shù)后, $0的值不會(huì)發(fā)生變化。 shift命令可以帶有一個(gè)整數(shù)作為參數(shù)預(yù)先定義的特殊變量$# 命令行上參數(shù)的個(gè)數(shù),但不包含shell腳本名本身。因 此,$#可以給出實(shí)際參數(shù)的個(gè)數(shù)。$? 上一條命令執(zhí)行后的返回值(也稱(chēng)作 “返回碼”、 “退出狀態(tài)”、“退出碼”等)。它是一個(gè)十進(jìn)制數(shù)。$ 當(dāng)前進(jìn)程的進(jìn)程號(hào)。$! 上一個(gè)后臺(tái)命令對(duì)應(yīng)的進(jìn)程號(hào),這是一個(gè)由15位數(shù)字
21、構(gòu)成的數(shù)字串。$ 由當(dāng)前shell設(shè)置的執(zhí)行標(biāo)志名組成的字符串。$* 表示在命令行中實(shí)際給出的所有實(shí)參字符串,它并不僅限于9個(gè)實(shí)參。$ 它與$*基本功能相同,即表示在命令行中給出的所有實(shí)參。但“$”與“$*”不同。環(huán)境變量(1)常用的環(huán)境變量 HOME:用戶(hù)主目錄的全路徑名 LOGNAME:即你的注冊(cè)名,由Linux自動(dòng)設(shè)置 MAIL:你的系統(tǒng)信箱的路徑 PATH:shell從中查找命令的目錄列表??梢栽O(shè)置它, 如:PATH=$PATH:$HOME/bin PS1:shell的主提示符。 bash默認(rèn)的主提示符一般為“s-v$ ”。其中,s表示shell的名稱(chēng);v表示bash的版本號(hào)如:PS1
22、=Enter Command PWD:你當(dāng)前工作目錄的路徑 SHELL:你當(dāng)前使用的shell TERM: 你的終端類(lèi)型環(huán)境變量(2)2使用環(huán)境變量 如果要使用環(huán)境變量或其它shell變量的值,必須在變量名之前加上一個(gè)“$”符號(hào),不能直接使用變量名。 如:cd $HOME3刪除環(huán)境變量 $ unset NAME環(huán)境文件 bash的環(huán)境文件包括.bash_profile文件、.bashrc文件、.bash_logout文件等。 在.bash_profile中,設(shè)置了環(huán)境變量和文件掩碼(umask) 名為.bashrc的腳本,每次啟動(dòng)bash時(shí)便會(huì)執(zhí)行它。它只含有針對(duì)bash的命令,可以用來(lái)設(shè)置別
23、名。.bashrc在.bash_profile之后執(zhí)行 .bash_logout,它僅在退出注冊(cè)的時(shí)候運(yùn)行 export語(yǔ)句一個(gè)進(jìn)程在自己的環(huán)境中定義的變量是局部變量,僅限于自身范圍,不能自動(dòng)傳給其子進(jìn)程。就是說(shuō),子進(jìn)程只能繼承父進(jìn)程的公用區(qū)和轉(zhuǎn)出區(qū)中的數(shù)據(jù),而每個(gè)進(jìn)程的數(shù)據(jù)區(qū)和棧區(qū)是私有的,不能繼承。為了使其后的各個(gè)子進(jìn)程能繼承父進(jìn)程中定義的變量,就必須用export(轉(zhuǎn)出)命令將這些變量送入進(jìn)程轉(zhuǎn)出區(qū)。export命令的一般使用形式是:export 變量名 環(huán)境變量的設(shè)置和顯示 設(shè)置變量要用如下形式:變量名=值 如果變量值的字符串中帶有空格等特殊字符,需要用引號(hào)把整個(gè)字符串括起來(lái)。 例如:
24、$ PS1=OK 利用export命令將這些變量輸出,使它們成為公用量。如: export HOME HZ LOGNAME TERM 可以利用env命令列出所有的環(huán)境變量,包括本進(jìn)程及以前的“祖先進(jìn)程”所輸出的變量set命令set命令的功能主要有三個(gè): 顯示迄今為止所定義的全部變量,包括局部量和公用量; 用來(lái)設(shè)定位置參數(shù)的值; 改變執(zhí)行shell腳本時(shí)的選項(xiàng)設(shè)定,可以使用戶(hù)改變shell的功能。設(shè)置標(biāo)志的一般形式是: set -標(biāo)志 例如:set -x關(guān)閉標(biāo)志的一般形式是: set +標(biāo)志 例如:set +x參數(shù)置換變量 參數(shù)置換變量是另一種為變量賦值的方式,其一般形式是: 變量2=$ 變量1
25、 op 字符串其中,op表示操作符,它可以是下列四個(gè)操作符之一: : : = : + : ?變量2的值取決于變量1(參數(shù))是否為空串、利用哪個(gè)操作符以及字符串的取值。在操作符的前后不留空格。例如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不變 四種參數(shù)置換變量的格式與功能算術(shù)運(yùn)算(1)bash中執(zhí)行整數(shù)算術(shù)運(yùn)算的命令是let,其語(yǔ)法格式為: let arg 其中arg是單獨(dú)的算術(shù)表達(dá)式。它使用C語(yǔ)言中表達(dá)式的語(yǔ)法、優(yōu)先級(jí)和結(jié)合性。所有整型運(yùn)算符都得到支
27、持,此外,還提供了方冪運(yùn)算符“*”。 在算術(shù)表達(dá)式中直接利用名稱(chēng)訪(fǎng)問(wèn)命名的參數(shù),不要前面帶有“$”符號(hào)let 命令的替代表示形式是: (算術(shù)表達(dá)式)例如: let j=i*6+2等價(jià)于: (j=i*6+2)如果表達(dá)式的值是非0,那么返回的狀態(tài)值是0;否則,返回的狀態(tài)值是1。算術(shù)運(yùn)算(2) 當(dāng)表達(dá)式中有shell的特殊字符時(shí),必須用雙引號(hào)將其括起來(lái)。例如 let val=a|b 只有使用 $(算術(shù)表達(dá)式) 形式才能返回表達(dá)式的值if語(yǔ)句(1) if語(yǔ)句用于條件控制結(jié)構(gòu)中,其一般格式為: if 測(cè)試條件 then 命令1 else 命令2 fi 其中,if、then、else和fi是關(guān)鍵字。例如:
28、 if test -f $1 then echo $1 is an ordinary file . else echo $1 is not an ordinary file . fiif語(yǔ)句(2) if語(yǔ)句中else部分可以缺省。例如, if test -f $1 then echo $1 is an ordinary file . fi if 語(yǔ)句的else部分還可以是elseif結(jié)構(gòu),則用關(guān)鍵字“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的語(yǔ)句的更一般形式是:的語(yǔ)句的更一般形式是: if if 命令表命令表1 1 then then 命令表命令表2 2 else else 命令表命令表3 3 fi fi【例例4.114.11】 if if語(yǔ)句的應(yīng)用語(yǔ)句的應(yīng)用$ 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條件測(cè)試 條件測(cè)試有三種常用形式:一種是用test 命令,如上所示。另一種是用一對(duì)方括號(hào)將測(cè)試條件括起來(lái)。這兩種形式是完全等價(jià)的。例如,測(cè)試位置參數(shù)$1是否是已存在的普通文件,可寫(xiě)為: test -f $1也完全可寫(xiě)成: -f $1 第三種
31、形式是: 條件表達(dá)式 test命令可以和多種系統(tǒng)運(yùn)算符一起使用。這些運(yùn)算符可以分為四類(lèi):文件測(cè)試運(yùn)算符、字符串測(cè)試運(yùn)算符、數(shù)值測(cè)試運(yùn)算符和邏輯運(yùn)算符。 參 數(shù) 功 能 -r 文件名 若文件存在并且是用戶(hù)可讀的,則測(cè)試條件為真 -w 文件名 若文件存在并且是用戶(hù)可寫(xiě)的,則測(cè)試條件為真 -x 文件名 若文件存在并且是用戶(hù)可執(zhí)行的,則測(cè)試條件為真-f 文件名 若文件存在并且是普通文件,則測(cè)試條件為真 -d 文件名 若文件存在并且是目錄文件,則測(cè)試條件為真 -p 文件名 若文件存在并且是命名的FIFO文件,則測(cè)試條件為真-b 文件名 若文件存在并且是塊設(shè)備文件,則測(cè)試條件為真 -c 文件名 若文件存在
32、并且是字符設(shè)備文件,則測(cè)試條件為真 -s 文件名 若文件存在并且文件的長(zhǎng)度大于0,則測(cè)試條件為真 -t 文件描述字 若文件被打開(kāi)且其文件描述字是與終端設(shè)備相關(guān)的,則測(cè)試條件為真。默認(rèn)的“文件描述字”是1 1 1有關(guān)文件方面的測(cè)試有關(guān)文件方面的測(cè)試 參 數(shù) 功 能 -z s1如果字符串s1的長(zhǎng)度為0,則測(cè)試條件為真。 -n s1如果字符串s1的長(zhǎng)度大于0,則測(cè)試條件為真。 s1如果字符串s1不是空字符串,則測(cè)試條件為真。 s1 = s2如果s1等于s2,則測(cè)試條件為真?!啊币部梢杂谩啊贝?。在“”前后應(yīng)有空格。 s1 != s2如果s1不等于s2,則測(cè)試條件為真。 s1 s2如果按字典順序s1在
33、s2之后,則測(cè)試條件為真2 2有關(guān)字符串方面的測(cè)試有關(guān)字符串方面的測(cè)試 參 數(shù) 功 能 n1 -eq n2如果整數(shù)n1等于n2,則測(cè)試條件為真 n1 -ne n2 如果整數(shù)n1不等于n2,則測(cè)試條件為真 n1 -lt n2 如果n1小于n2,則測(cè)試條件為真 n1 -le n2如果n1小于或等于n2,則測(cè)試條件為真 n1 -gt n2如果n1大于n2,則測(cè)試條件為真 n1 -ge n2如果n1大于或等于n2,則測(cè)試條件為真3 3有關(guān)數(shù)值方面的測(cè)試有關(guān)數(shù)值方面的測(cè)試 4邏輯運(yùn)算符 上述測(cè)試條件可以在if 語(yǔ)句或循環(huán)語(yǔ)句中單個(gè)使用,也可以通過(guò)邏輯運(yùn)算符把它們組合起來(lái)使用。可以在測(cè)試語(yǔ)句中使用的邏輯運(yùn)
34、算符有: ! 邏輯非( NOT ),它放在任意邏輯表達(dá)式之前,使原來(lái)為真的表達(dá)式變?yōu)榧?,使原?lái)為假的變?yōu)檎?。例如?! -r $1 , ! test -r $1等。 - a 邏輯與( AND ),它放在兩個(gè)邏輯表達(dá)式中間,僅當(dāng)兩個(gè)表達(dá)式都為真時(shí),結(jié)果才為真。例如, - f $myfile - a - r $myfile - o 邏輯或( OR ),它放在兩個(gè)邏輯表達(dá)式中間,其中只要有一個(gè)表達(dá)式為真,結(jié)果就為真。例如, $a -ge 0 -o $b -le 100 (表達(dá)式) 圓括號(hào),它可以把一個(gè)邏輯表達(dá)式括起來(lái),使之成為一個(gè)整體,優(yōu)先得到運(yùn)算。例如, ( $a -ge 0 ) -a ( $b
35、-le 100 ) 邏輯表達(dá)式中的條件測(cè)試運(yùn)算符優(yōu)先級(jí)高于“!” 運(yùn)算符,“!” 運(yùn)算符的優(yōu)先級(jí)高于“ -a”運(yùn)算符,“-a”運(yùn)算符高于 “-o”,而且圓括號(hào)( )高于 “-a”5特殊條件測(cè)試(1) :表示不做任何事情,其退出值為0。(2)true 表示總為真,其退出值總是0。(3)false 表示總為假,其退出值是255。case語(yǔ)句 case語(yǔ)句允許進(jìn)行多重條件選擇。其一般語(yǔ)法形式是: case 字符串 in 模式字符串1) 命令 命令; 模式字符串2) 命令 命令; 模式字符串n) 命令 命令; esac 在使用case語(yǔ)句時(shí)應(yīng)注意: 每個(gè)模式字符串后面可有一條或多條命令,其最后一條命令
36、必須以?xún)蓚€(gè)分號(hào)(即;)結(jié)束。模式字符串中可以使用通配符 如果一個(gè)模式字符串中包含多個(gè)模式,那么各模式之間應(yīng)以豎線(xiàn)(|)隔開(kāi),表示各模式是“或”的關(guān)系,即只要給定字符串與其中一個(gè)模式相配,就會(huì)執(zhí)行其后的命令表 各模式字符串應(yīng)是唯一的,不應(yīng)重復(fù)出現(xiàn)。并且要合理安排它們的出現(xiàn)順序。 case語(yǔ)句以關(guān)鍵字case開(kāi)頭,以關(guān)鍵字esac(是case倒過(guò)來(lái)寫(xiě)!)結(jié)束。 case的退出(返回)值是整個(gè)結(jié)構(gòu)中最后執(zhí)行的那個(gè)命令的退出值。若沒(méi)有執(zhí)行任何命令,則退出值為零while語(yǔ)句 shell中有三種用于循環(huán)的語(yǔ)句,它們是:while語(yǔ)句、for語(yǔ)句和until語(yǔ)句。 while語(yǔ)句的一般形式是: while
37、 測(cè)試條件 do 命令表 done 測(cè)試條件部分除使用test命令或等價(jià)的方括號(hào)外,還可以是一組命令。根據(jù)其最后一個(gè)命令的退出值決定是否進(jìn)入循環(huán)體執(zhí)行。4.9.5 until4.9.5 until語(yǔ)句語(yǔ)句 untiluntil語(yǔ)句的一般形式是:語(yǔ)句的一般形式是: until until 測(cè)試條件測(cè)試條件 dodo 命令表命令表 donedone 它與它與whilewhile語(yǔ)句很相似,只是測(cè)試條件不同:當(dāng)測(cè)試條語(yǔ)句很相似,只是測(cè)試條件不同:當(dāng)測(cè)試條件為假時(shí),才進(jìn)入循環(huán)體,直至測(cè)試條件為真時(shí)終止件為假時(shí),才進(jìn)入循環(huán)體,直至測(cè)試條件為真時(shí)終止循環(huán)。循環(huán)。4.9.6 for4.9.6 for語(yǔ)句語(yǔ)句
38、 其使用方式主要有兩種:一種是值表方式,另一種是算術(shù)其使用方式主要有兩種:一種是值表方式,另一種是算術(shù)表達(dá)式方式。表達(dá)式方式。1 1值表方式值表方式 其一般格式是:其一般格式是: for for 變量變量 in in 值表值表 ;do do 命令表;命令表;donedone 根據(jù)循環(huán)變量的取值方式,其使用格式可分為三種:根據(jù)循環(huán)變量的取值方式,其使用格式可分為三種:格式一:格式一: for for 變量變量 in in 值表值表 dodo 命令表命令表 donedone格式二:格式二: for for 變量變量 in in 文件正則表達(dá)式文件正則表達(dá)式 dodo 命令表命令表 donedone
39、格式三:格式三: for i in $for i in $* * 或者或者 for i for i do do do do 命令表命令表 命令表命令表 done donedone done2 2算術(shù)表達(dá)式方式算術(shù)表達(dá)式方式 其一般格式是:其一般格式是: 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是算術(shù)表達(dá)式。它的執(zhí)行過(guò)程與是算術(shù)表達(dá)式。它的執(zhí)行過(guò)程與C C語(yǔ)言
40、中語(yǔ)言中forfor語(yǔ)句相似,即:語(yǔ)句相似,即: 先按算術(shù)運(yùn)算規(guī)則計(jì)算表達(dá)式先按算術(shù)運(yùn)算規(guī)則計(jì)算表達(dá)式e1e1; 接著計(jì)算接著計(jì)算e2e2,如果,如果e2e2值不為值不為0 0,則執(zhí)行命令表中的命令,則執(zhí)行命令表中的命令,并且計(jì)算并且計(jì)算e3e3;然后重復(fù),直至;然后重復(fù),直至e2e2為為0 0,退出循環(huán)。,退出循環(huán)。 4.9.7 break4.9.7 break命令和命令和continuecontinue命令命令1 1breakbreak命令命令 breakbreak命令使程序從循環(huán)體中退出來(lái)。其語(yǔ)法格式是:命令使程序從循環(huán)體中退出來(lái)。其語(yǔ)法格式是: break n break n 2 2c
41、ontinuecontinue命令命令 continuecontinue命令跳過(guò)循環(huán)體中在它之后的語(yǔ)句,回到本層命令跳過(guò)循環(huán)體中在它之后的語(yǔ)句,回到本層循環(huán)的開(kāi)頭,進(jìn)行下一次循環(huán)。其語(yǔ)法格式是:循環(huán)的開(kāi)頭,進(jìn)行下一次循環(huán)。其語(yǔ)法格式是: continue n continue n 4.9.8 exit4.9.8 exit命令命令 exitexit命令的功能是立即退出正在執(zhí)行的命令的功能是立即退出正在執(zhí)行的shellshell腳本,并設(shè)腳本,并設(shè)定退出值。其語(yǔ)法格式是:定退出值。其語(yǔ)法格式是: exit n exit n 4.9.9 select4.9.9 select語(yǔ)句語(yǔ)句 select s
42、elect 語(yǔ)句通常用于菜單的設(shè)計(jì),它自動(dòng)完成接收用戶(hù)語(yǔ)句通常用于菜單的設(shè)計(jì),它自動(dòng)完成接收用戶(hù)輸入的整個(gè)過(guò)程,包括顯示一組菜單項(xiàng)以及讀入用戶(hù)的選輸入的整個(gè)過(guò)程,包括顯示一組菜單項(xiàng)以及讀入用戶(hù)的選擇。擇。 select select 語(yǔ)句的語(yǔ)法形式為:語(yǔ)句的語(yǔ)法形式為: select identifierin wordselect identifierin word do do 命令表命令表 donedone如果如果in wordin word這一部分被省略,那么參數(shù)這一部分被省略,那么參數(shù)identifieridentifier就以就以位置參數(shù)(位置參數(shù)($1, $2, $1, $2, )作
43、為給定的值。)作為給定的值。4.10 4.10 函數(shù)函數(shù) 在在shellshell腳本中可以定義并使用函數(shù)。其定義格式為:腳本中可以定義并使用函數(shù)。其定義格式為: functionfunction函數(shù)名函數(shù)名( )( ) 命令表命令表 函數(shù)應(yīng)先定義,后使用。調(diào)用函數(shù)時(shí),直接利用函數(shù)名,函數(shù)應(yīng)先定義,后使用。調(diào)用函數(shù)時(shí),直接利用函數(shù)名,如如showfileshowfile,不必帶圓括號(hào),不必帶圓括號(hào) shellshell腳本與函數(shù)間的參數(shù)傳遞可利用位置參數(shù)和變量直腳本與函數(shù)間的參數(shù)傳遞可利用位置參數(shù)和變量直接傳遞接傳遞 通常,函數(shù)中的最后一個(gè)命令執(zhí)行之后,就退出被調(diào)函數(shù)。通常,函數(shù)中的最后一個(gè)命
44、令執(zhí)行之后,就退出被調(diào)函數(shù)。也可利用也可利用returnreturn命令立即退出函數(shù),其語(yǔ)法格式是:命令立即退出函數(shù),其語(yǔ)法格式是: return n return n 4.11 4.11 作作 業(yè)業(yè) 控控 制制 執(zhí)行命令執(zhí)行命令set -o monitorset -o monitor,則交互式,則交互式shellshell就實(shí)就實(shí)施作業(yè)管理。作業(yè)管理的命令有施作業(yè)管理。作業(yè)管理的命令有jobsjobs,killkill,bgbg,fgfg和和waitwait。 4.11.1 jobs4.11.1 jobs命令命令 不帶參數(shù)時(shí),可列出當(dāng)前尚未完成的作業(yè)。例如:不帶參數(shù)時(shí),可列出當(dāng)前尚未完成的作
45、業(yè)。例如: $ 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命令可以向指定的進(jìn)程發(fā)送命令可以向指定的進(jìn)程發(fā)送TERMTERM(終止)信(終止)信號(hào)或者指定的信號(hào)。號(hào)或者指定的信號(hào)。 其中一些信號(hào)可以使作業(yè)中止運(yùn)行。其中一些信號(hào)可以使作業(yè)中止運(yùn)行。 例如:例如:kill -9 1893kill -9 1893 信號(hào)可以由信號(hào)號(hào)碼(信號(hào)可以由信號(hào)
46、號(hào)碼(sigsig)或者信號(hào)名()或者信號(hào)名(signamesigname)指定。利用指定。利用kill -lkill -l命令可以列出全部信號(hào)名。命令可以列出全部信號(hào)名。4.11.3 bg4.11.3 bg和和fgfg命令命令 bgbg命令可以把前臺(tái)作業(yè)切換成后臺(tái)作業(yè)命令可以把前臺(tái)作業(yè)切換成后臺(tái)作業(yè) 其語(yǔ)法格式是:其語(yǔ)法格式是: bg job bg job fgfg命令可以把后臺(tái)作業(yè)切換成前臺(tái)作業(yè)命令可以把后臺(tái)作業(yè)切換成前臺(tái)作業(yè) 其語(yǔ)法格式是:其語(yǔ)法格式是: fg jobfg job 僅當(dāng)作業(yè)控制被激活,這些命令才起作用僅當(dāng)作業(yè)控制被激活,這些命令才起作用 4.12 shell4.12 sh
47、ell內(nèi)置命令內(nèi)置命令 這些命令構(gòu)造在這些命令構(gòu)造在shellshell內(nèi)部,從而在內(nèi)部,從而在shellshell進(jìn)程內(nèi)執(zhí)行。已在進(jìn)程內(nèi)執(zhí)行。已在前面介紹過(guò)的內(nèi)置命令:前面介紹過(guò)的內(nèi)置命令: :,:, . 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 可以利用別的命令行作為自己的參數(shù)(可以利用別的命令行作為自己的參數(shù)(argarg),進(jìn)行相應(yīng)的變),進(jìn)行相應(yīng)的變量或命令替換,并把替換結(jié)果結(jié)合成一個(gè)新的命令行,然后量或命令替換,并把替換結(jié)果結(jié)合成一個(gè)新的命令行,然后讀取并加以執(zhí)行。讀取并加以執(zhí)行。 #!/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中執(zhí)行由參數(shù)中執(zhí)行由參數(shù)argarg指定的命令,并不創(chuàng)建新進(jìn)程指定的命令,并不創(chuàng)建新進(jìn)程 3 3hashhash命令命令 格式是:格式是: hash -r name hash -r name 可以確定并記住由可以確定并記
50、住由namename指定的每個(gè)命令在搜索路徑中的位指定的每個(gè)命令在搜索路徑中的位置。置。 4 4readonlyreadonly命令命令 格式是:格式是: readonly name readonly name 標(biāo)記給定的標(biāo)記給定的namename(變量名)是只讀的,以后不能通過(guò)賦值(變量名)是只讀的,以后不能通過(guò)賦值語(yǔ)句改變其值語(yǔ)句改變其值 5 5traptrap命令命令 用來(lái)設(shè)定接收到某個(gè)信號(hào)所完成的動(dòng)作,忽略某個(gè)信號(hào)的影用來(lái)設(shè)定接收到某個(gè)信號(hào)所完成的動(dòng)作,忽略某個(gè)信號(hào)的影響或者恢復(fù)該信號(hào)產(chǎn)生時(shí)系統(tǒng)預(yù)設(shè)的動(dòng)作。響或者恢復(fù)該信號(hào)產(chǎn)生時(shí)系統(tǒng)預(yù)設(shè)的動(dòng)作。 其格式是:其格式是: trap arg
51、n trap arg n 為某些信號(hào)另外指定處理方式。例如:為某些信號(hào)另外指定處理方式。例如: trap rm - f $temp ; exit 0 1 2 3 15trap rm - f $temp ; exit 0 1 2 3 15如果如果argarg是空串,如是空串,如 : : trap 2 trap 2 那么那么, ,信號(hào)信號(hào)2 2就被就被shellshell和它引用的命令忽略。和它引用的命令忽略。如果缺省如果缺省argarg,則把所有陷入信號(hào),則把所有陷入信號(hào)n n的動(dòng)作恢復(fù)成原來(lái)系統(tǒng)的動(dòng)作恢復(fù)成原來(lái)系統(tǒng)設(shè)置的動(dòng)作。如設(shè)置的動(dòng)作。如: : trap 1 2 trap 1 2 如果如果
52、traptrap命令后面沒(méi)有任何參數(shù),則顯示與每個(gè)信號(hào)相關(guān)命令后面沒(méi)有任何參數(shù),則顯示與每個(gè)信號(hào)相關(guān)的命令表。的命令表。6 6typetype命令命令 格式是:格式是: type name type name 功能是,對(duì)于每一個(gè)功能是,對(duì)于每一個(gè)namename,如果作為命令名,它是如何被,如果作為命令名,它是如何被解釋的,如內(nèi)置命令、一般命令搜索路徑等。解釋的,如內(nèi)置命令、一般命令搜索路徑等。 7 7unsetunset命令命令 格式是:格式是:unset name unset name 刪除由刪除由namename指定的相應(yīng)變量或函數(shù)。指定的相應(yīng)變量或函數(shù)。 應(yīng)注意,變量應(yīng)注意,變量PAT
53、HPATH,PS1PS1,PS2PS2,MAILCHECKMAILCHECK和和IFSIFS不能被刪不能被刪除,即不能受除,即不能受unsetunset的作用。的作用。 8 8umaskumask命令命令 格式是格式是umask -S mask umask -S mask 將用戶(hù)文件創(chuàng)建掩碼設(shè)置為將用戶(hù)文件創(chuàng)建掩碼設(shè)置為maskmask的值。的值。9 9waitwait命令命令 格式是:格式是:wait n wait n 等待由等待由n n(進(jìn)程(進(jìn)程 IDID)指定的進(jìn)程終止,并報(bào)告終止?fàn)顟B(tài)。)指定的進(jìn)程終止,并報(bào)告終止?fàn)顟B(tài)。 4.13 shell4.13 shell腳本調(diào)試腳本調(diào)試 通常采用自底向上的方法,即:先搞清楚要腳本做什么,通常采用自
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 10 父母多愛(ài)我(教學(xué)設(shè)計(jì))-2023-2024學(xué)年道德與法治三年級(jí)上冊(cè)統(tǒng)編版
- 現(xiàn)房定金合同范本
- 10古詩(shī)三首《石灰吟》教學(xué)設(shè)計(jì)-2023-2024學(xué)年統(tǒng)編版語(yǔ)文六年級(jí)下冊(cè)
- 白粘土買(mǎi)賣(mài)合同范本
- 2025屆高考生物備考教學(xué)設(shè)計(jì):第七章 生物的變異和進(jìn)化之基因頻率與基因型頻率的計(jì)算
- 信號(hào)塔合同范本
- 教師會(huì)校長(zhǎng)講話(huà)稿
- 合同范本游戲簽約
- 住宿整棟出租合同范本
- 污水bot合同范本
- 【高考真題】2024年新課標(biāo)全國(guó)Ⅱ卷高考語(yǔ)文真題試卷(含答案)
- 旅游服務(wù)質(zhì)量評(píng)價(jià)體系
- 義烏市建筑工程質(zhì)量通病防治措施100條(2022版本)
- 統(tǒng)編版高中政治必修3必背主觀題
- 供電所安全第一課培訓(xùn)
- 鄭州鐵路職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試參考試題庫(kù)(含答案)
- 岳陽(yáng)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試參考試題庫(kù)(含答案)
- 部編人教版六年級(jí)道德與法治下冊(cè)第7課《多元文化 多樣魅力》教學(xué)設(shè)計(jì)
- 新時(shí)代勞動(dòng)教育教程(高職)大學(xué)生勞動(dòng)教育全套教學(xué)課件
- 2023年開(kāi)展的課外讀物負(fù)面清單管理的具體措施
- 《國(guó)防動(dòng)員實(shí)施》課件
評(píng)論
0/150
提交評(píng)論