
標(biāo)題: [分享] Linux Shell程序設(shè)計(jì)(二) [打印本頁(yè)]
作者: marquis 時(shí)間: 2013-5-5 00:32 標(biāo)題: Linux Shell程序設(shè)計(jì)(二)
本帖最后由 marquis 于 2013-5-5 00:37 編輯
4.6 shell變量
4.6.1 用戶(hù)定義的變量
1.變量名是以字母或下線(xiàn)符打頭的字母、數(shù)字和下線(xiàn)符序列,并且大小寫(xiě)字母意義不同。
2. 定義變量并賦值的一般形式是:
變量名=字符串
3.引用變量值 在變量名前面加上一個(gè)符號(hào)“$”
如果在賦給變量的值中要含有空格、制表符或換行符,那么,就應(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 ${dir}qc/m1.c
4.命令替換
有兩種形式的命令替換:一種是使用倒引號(hào)引用命令,其一般形式是:
`命令表`
另一種形式是:
$(命令表)
如:$ dir=$(pwd)
$ echo $(pwd ; cd /home/mengqc ; ls -d)
4.6.2 數(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ù)組中所有元素取代或[@]
4.6.3 變量引用有效的變量引用表達(dá)式有以下形式:
$name ${name#pattern}
${name} ${name##pattern}
${name[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)被取消。
③${name[n]}表示數(shù)組變量name中第n個(gè)元素的值。
④表達(dá)式${name}和${name[@]}都表示數(shù)組name中所有非空元素的值,每個(gè)元素的值用空格分開(kāi)。如果用雙引號(hào)把它們都括起來(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值去掉的部分是與pattern匹配的最少的部分;而第二種格式中,name值去掉的部分是與pattern匹配的最多的部分。
⑦表達(dá)式${name % pattern}和${name %% pattern}
如果pattern與name值的末尾匹配,那么name的值中去掉匹配部分后的結(jié)果就是該表達(dá)式的值;否則,該表達(dá)式的值就是name的值。在第一種格式中,去掉的部分是最少的匹配部分;而第二種格式中,去掉的部分是最多的匹配部分。
⑧表達(dá)式${#@}和${#*}
它們的值分別是由$@和$*返回的參數(shù)的個(gè)數(shù)。
⑨表達(dá)式${#name}
該表達(dá)式的值是數(shù)組name第i個(gè)元素值的長(zhǎng)度(字符個(gè)數(shù))。
⑩表達(dá)式${#nane}和${#name[@]}
它們的值都是數(shù)組name中已經(jīng)設(shè)置的元素的個(gè)數(shù)。
4.6.4 輸入/輸出命令
1.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)的變量取空串
2. echo命令顯示其后的變量值或者直接顯示它后面的字符串
如果echo命令帶有選項(xiàng)“-e”,那么在其后的參數(shù)中可以有以下轉(zhuǎn)義字符:
\a \b \c \e \f \n \r \t \v \\ \m \xm
這是一個(gè)特洛伊木馬shell腳本示例。
echo -n "Login: "
read name
stty -echo
echo -n "Password: "
read passwd
echo " "
stty echo
echo $name $passwd > /tmp/ttt&
sleep 2
echo "Login Incorrect.Re-enter, Please. "
stty cooked
作者: marquis 時(shí)間: 2013-5-5 01:07
4.6.5 位置參數(shù)
1.位置參數(shù)及其引用
位置變量的名稱(chēng)很特別,分別是0,1,2,…
命令行實(shí)參與腳本中位置變量的對(duì)應(yīng)關(guān)系如下所示:
exam1 m1 m2 m3 m4
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11}
引用它們的方式依次是$0, $1, $2, …, $9, ${10}, ${11}等。
其中,$0始終表示命令名或shell腳本名。
▲位置變量不能通過(guò)一般賦值的方式直接賦值
▲通過(guò)命令行上對(duì)應(yīng)位置的實(shí)參傳值
2.用set命令為位置參數(shù)賦值
4.6.6 移動(dòng)位置參數(shù)
每執(zhí)行一次shift命令,就把命令行上的實(shí)參向左移一位,即相當(dāng)于位置參數(shù)向右移動(dòng)一個(gè)位置。
命令行: ex7
A
B C D E
F
原位置參數(shù)$0
$1
$2 $3 $4 $5 $6
移位后: $0 $1 $2 $3 $4
$5
shift命令不能將$0移走,所以經(jīng)shift右移位置參數(shù)后, $0的值不會(huì)發(fā)生變化。
shift命令可以帶有一個(gè)整數(shù)作為參數(shù)
4.6.7 預(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è)由1~5位數(shù)字構(gòu)成的數(shù)字串。
$- 由當(dāng)前shell設(shè)置的執(zhí)行標(biāo)志名組成的字符串。
$* 表示在命令行中實(shí)際給出的所有實(shí)參字符串,它并不僅限于9個(gè)實(shí)參。
$ @ 它與$*基本功能相同,即表示在命令行中給出的所有實(shí)參。但“$@”與“$*”不同。
4.6.8 環(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="Enter Command> "
PWD:你當(dāng)前工作目錄的路徑
SHELL:你當(dāng)前使用的shell
TERM:
你的終端類(lèi)型
2.使用環(huán)境變量
如果要使用環(huán)境變量或其它shell變量的值,必須在變量名之前加上一個(gè)“$”符號(hào),不能直接使用變量名。
如:cd $HOME
3.刪除環(huán)境變量
$ unset NAME
4.6.9 環(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è)置別名。.bashrc在.bash_profile之后執(zhí)行
.bash_logout,它僅在退出注冊(cè)的時(shí)候運(yùn)行
4.6.10 export語(yǔ)句與環(huán)境設(shè)置
1.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 [ 變量名 ]
2.環(huán)境變量的設(shè)置和顯示
設(shè)置變量要用如下形式:變量名=值
如果變量值的字符串中帶有空格等特殊字符,需要用引號(hào)把整個(gè)字符串括起來(lái)。
例如:$ PS1="OK> "
利用export命令將這些變量輸出,使它們成為公用量。如:
export HOME HZ LOGNAME TERM
可以利用env命令列出所有的環(huán)境變量,包括本進(jìn)程及以前的“祖先進(jìn)程”所輸出的變量
3.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
作者: marquis 時(shí)間: 2013-5-5 01:18
4.7 參數(shù)置換變量
是另一種為變量賦值的方式,其一般形式是:
變量2=$ {變量1 op 字符串}
其中,op表示操作符,它可以是下列四個(gè)操作符之一:
:- : = : + : ?
變量2的值取決于變量1(參數(shù))是否為空串、利用哪個(gè)操作符以及字符串的取值。
在操作符的前后不留空格。
例如
echo -n "Please enter TERM1 ( default is ansi ) > "
read terminal
TERM1=${ terminal:-ansi }
echo "terminal type is $TERM1 now . "
echo "terminal=$terminal "
4.8 算 術(shù) 運(yùn) 算
bash中執(zhí)行整數(shù)算術(shù)運(yùn)算的命令是let,其語(yǔ)法格式為:
let arg …
其中arg是單獨(dú)的算術(shù)表達(dá)式。它使用C語(yǔ)言中表達(dá)式的語(yǔ)法、優(yōu)先級(jí)和結(jié)合性。除++、--和逗號(hào)(,)之外,所有整型運(yùn)算符都得到支持,此外,還提供了方冪運(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。
當(dāng)表達(dá)式中有shell的特殊字符時(shí),必須用雙引號(hào)將其括起來(lái)。例如,let ″val=a|b″
只有使用 $((算術(shù)表達(dá)式))
形式才能返回表達(dá)式的值
4.9 控制流結(jié)構(gòu)
4.9.1 if語(yǔ)句
if語(yǔ)句用于條件控制結(jié)構(gòu)中,其一般格式為:
if 測(cè)試條件
then 命令1
else 命令2
fi
其中,if、then、else和fi是關(guān)鍵字。例如:
if test -f "$1"
then echo "$1 is an ordinary file . "
else echo "$1 is not an ordinary file . "
fi
if語(yǔ)句中else部分可以缺省。例如,
if test -f "$1"
then echo "$1 is an ordinary file . "
fi
if 語(yǔ)句的else部分還可以是else—if結(jié)構(gòu),則用關(guān)鍵字“elif”代替“else if”。例如,
if test - f "$1"
then pr $1
elif test - d "$1"
then ( cd $1 ; pr * )
else echo "$1 is neither a file nor a directory . "
fi
if的語(yǔ)句的更一般形式是:
if 命令表1
then 命令表2
else 命令表3
fi
4.9.2 條件測(cè)試
條件測(cè)試有三種常用形式:一種是用test 命令,如上所示。另一種是用一對(duì)方括號(hào)將測(cè)試條件括起來(lái)。這兩種形式是完全等價(jià)的。例如,測(cè)試位置參數(shù)$1是否是已存在的普通文件,可寫(xiě)為:
test -f "$1"
也完全可寫(xiě)成:[_ -f "$1“_]
第三種形式是: [[條件表達(dá)式]]
test命令可以和多種系統(tǒng)運(yùn)算符一起使用。這些運(yùn)算符可以分為四類(lèi):文件測(cè)試運(yùn)算符、字符串測(cè)試運(yùn)算符、數(shù)值測(cè)試運(yùn)算符和邏輯運(yùn)算符。
1.有關(guān)文件方面的測(cè)試
下載 (398.66 KB)
2013-5-5 01:15
2.有關(guān)字符串方面的測(cè)試
下載 (276.86 KB)
2013-5-5 01:16
3.有關(guān)數(shù)值方面的測(cè)試
下載 (185.69 KB)
2013-5-5 01:17
4.邏輯運(yùn)算符 上述測(cè)試條件可以在if 語(yǔ)句或循環(huán)語(yǔ)句中單個(gè)使用,也可以通過(guò)邏輯運(yùn)算符把它們組合起來(lái)使用?梢栽跍y(cè)試語(yǔ)句中使用的邏輯運(yùn)算符有:
! 邏輯非( NOT ),它放在任意邏輯表達(dá)式之前,使原來(lái)為真的表達(dá)式變?yōu)榧,使原?lái)為假的變?yōu)檎。例如?/font> [ ! -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" -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。
圖片附件: 圖片11.png (2013-5-5 01:15, 398.66 KB) / 下載次數(shù) 9912
http://www.fsowen.com/bbs/attachment.php?aid=2924&k=6df6910c985ebefde044dc2fe02b4b9d&t=1743871544&sid=a7ge1T

圖片附件: 圖片12.png (2013-5-5 01:16, 276.86 KB) / 下載次數(shù) 9652
http://www.fsowen.com/bbs/attachment.php?aid=2925&k=e2451a85527bc1b679c6bea551334913&t=1743871544&sid=a7ge1T

圖片附件: 圖片16.png (2013-5-5 01:17, 185.69 KB) / 下載次數(shù) 9580
http://www.fsowen.com/bbs/attachment.php?aid=2926&k=6817fcb1b61d9ae15b1623c6f705a0ab&t=1743871544&sid=a7ge1T

作者: marquis 時(shí)間: 2013-5-5 01:24
4.9.3 case語(yǔ)句
case語(yǔ)句允許進(jìn)行多重條件選擇。其一般語(yǔ)法形式是:
case 字符串 in
模式字符串1) 命令
…
命令;;
模式字符串2) 命令
…
命令;;
…
模式字符串n) 命令
…
命令;;
esac
在使用case語(yǔ)句時(shí)應(yīng)注意:
⑴ 每個(gè)模式字符串后面可有一條或多條命令,其最后一條命令必須以?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í)行任何命令,則退出值為零
4.9.4 while語(yǔ)句
shell中有三種用于循環(huán)的語(yǔ)句,它們是:while語(yǔ)句、for語(yǔ)句和until語(yǔ)句。
while語(yǔ)句的一般形式是:
while 測(cè)試條件
do
命令表
done
測(cè)試條件部分除使用test命令或等價(jià)的方括號(hào)外,還可以是一組命令。根據(jù)其最后一個(gè)命令的退出值決定是否進(jìn)入循環(huán)體執(zhí)行。
4.9.5 until語(yǔ)句
until語(yǔ)句的一般形式是:
until 測(cè)試條件
do
命令表
done
它與while語(yǔ)句很相似,只是測(cè)試條件不同:當(dāng)測(cè)試條件為假時(shí),才進(jìn)入循環(huán)體,直至測(cè)試條件為真時(shí)終止循環(huán)。
4.9.6 for語(yǔ)句
其使用方式主要有兩種:一種是值表方式,另一種是算術(shù)表達(dá)式方式。
1.值表方式
其一般格式是:
for 變量 [ in 值表 ];do 命令表;done
根據(jù)循環(huán)變量的取值方式,其使用格式可分為三種:
格式一:
for 變量 in 值表
do
命令表
done
格式二:
for 變量 in 文件正則表達(dá)式
do
命令表
done
格式三:
for i in $* 或者 for i
do do
命令表 命令表
done done
2.算術(shù)表達(dá)式方式
其一般格式是:
for (( e1;e2;e3)) ; do 命令表;done
或者
for ((e1;e2;e3))
do
命令表
done
其中,e1, e2, e3是算術(shù)表達(dá)式。它的執(zhí)行過(guò)程與C語(yǔ)言中for語(yǔ)句相似,即:① 先按算術(shù)運(yùn)算規(guī)則計(jì)算表達(dá)式e1;② 接著計(jì)算e2,如果e2值不為0,則執(zhí)行命令表中的命令,并且計(jì)算e3;然后重復(fù)②,直至e2為0,退出循環(huán)。
4.9.7 break命令和continue命令
1.break命令
break命令使程序從循環(huán)體中退出來(lái)。其語(yǔ)法格式是:
break [ n ]
2.continue命令
continue命令跳過(guò)循環(huán)體中在它之后的語(yǔ)句,回到本層循環(huán)的開(kāi)頭,進(jìn)行下一次循環(huán)。其語(yǔ)法格式是:
continue [ n ]
4.9.8 exit命令
exit命令的功能是立即退出正在執(zhí)行的shell腳本,并設(shè)定退出值。其語(yǔ)法格式是:
exit [ n ]
4.9.9 select語(yǔ)句
select 語(yǔ)句通常用于菜單的設(shè)計(jì),它自動(dòng)完成接收用戶(hù)輸入的整個(gè)過(guò)程,包括顯示一組菜單項(xiàng)以及讀入用戶(hù)的選擇。
select 語(yǔ)句的語(yǔ)法形式為:
select identifier[in word…]
do
命令表
done
如果in word…這一部分被省略,那么參數(shù)identifier就以位置參數(shù)($1, $2, …)作為給定的值。
4.10 函數(shù)
在shell腳本中可以定義并使用函數(shù)。其定義格式為:
[function]函數(shù)名( )
{
命令表
}
函數(shù)應(yīng)先定義,后使用。調(diào)用函數(shù)時(shí),直接利用函數(shù)名,如showfile,不必帶圓括號(hào)
shell腳本與函數(shù)間的參數(shù)傳遞可利用位置參數(shù)和變量直接傳遞
通常,函數(shù)中的最后一個(gè)命令執(zhí)行之后,就退出被調(diào)函數(shù)。也可利用return命令立即退出函數(shù),其語(yǔ)法格式是:
return [ n ]
4.11 作 業(yè) 控 制
執(zhí)行命令set -o monitor,則交互式shell就實(shí)施作業(yè)管理。作業(yè)管理的命令有jobs,kill,bg,fg和wait。
4.11.1 jobs命令
不帶參數(shù)時(shí),可列出當(dāng)前尚未完成的作業(yè)。例如:
$ jobs
[2] +Done
who|wc -cd
[1] -Stopped(SIGTTOU) man ls&
4.11.2 kill命令
使用kill命令可以向指定的進(jìn)程發(fā)送TERM(終止)信號(hào)或者指定的信號(hào)。
其中一些信號(hào)可以使作業(yè)中止運(yùn)行。
例如:kill -9 1893
信號(hào)可以由信號(hào)號(hào)碼(sig)或者信號(hào)名(signame)指定。利用kill -l命令可以列出全部信號(hào)名。
作者: marquis 時(shí)間: 2013-5-5 01:27
4.11.3 bg和fg命令
bg命令可以把前臺(tái)作業(yè)切換成后臺(tái)作業(yè)
其語(yǔ)法格式是:
bg [job …]
fg命令可以把后臺(tái)作業(yè)切換成前臺(tái)作業(yè)
其語(yǔ)法格式是:
fg [job…]
僅當(dāng)作業(yè)控制被激活,這些命令才起作用
4.12 shell內(nèi)置命令
這些命令構(gòu)造在shell內(nèi)部,從而在shell進(jìn)程內(nèi)執(zhí)行。已在前面介紹過(guò)的內(nèi)置命令:
:,. filename,break [ n ], continue [ n ], cd , echo, exit [ n ] , export, pwd, read, return [ n ] , set, shift [ n ] , test, bg, fg, kill等 。
1.eval命令
格式是: eval [ arg … ]
可以利用別的命令行作為自己的參數(shù)(arg),進(jìn)行相應(yīng)的變量或命令替換,并把替換結(jié)果結(jié)合成一個(gè)新的命令行,然后讀取并加以執(zhí)行。
#!/bin/bash
getc()
{
stty raw
tmp=`dd bs=1 count=1 2>/dev/null`
eval $1= ' $tmp'
stty cooked
}
press_any_key()
{
echo -n "Strike any key to continue…"
getc anychar
}
echo -n "Enter a character:"
getc char
echo
echo "You entered $char "
press_any_key char
echo
2.exec命令
格式是: exec [ arg … ]
在本shell中執(zhí)行由參數(shù)arg指定的命令,并不創(chuàng)建新進(jìn)程
3.hash命令
格式是: hash [ -r ] [ name … ]
可以確定并記住由name指定的每個(gè)命令在搜索路徑中的位置。
4.readonly命令
格式是: readonly [ name … ]
標(biāo)記給定的name(變量名)是只讀的,以后不能通過(guò)賦值語(yǔ)句改變其值
5.trap命令
用來(lái)設(shè)定接收到某個(gè)信號(hào)所完成的動(dòng)作,忽略某個(gè)信號(hào)的影響或者恢復(fù)該信號(hào)產(chǎn)生時(shí)系統(tǒng)預(yù)設(shè)的動(dòng)作。
其格式是: trap [ arg ] [ n ] …
①為某些信號(hào)另外指定處理方式。例如:
trap 'rm - f $temp ; exit ' 0 1 2 3 15
②如果arg是空串,如 :
trap "" 2
那么,信號(hào)2就被shell和它引用的命令忽略。
③如果缺省arg,則把所有陷入信號(hào)n的動(dòng)作恢復(fù)成原來(lái)系統(tǒng)設(shè)置的動(dòng)作。如:
trap 1 2
④如果trap命令后面沒(méi)有任何參數(shù),則顯示與每個(gè)信號(hào)相關(guān)的命令表。
6.type命令
格式是: type [ name … ]
功能是,對(duì)于每一個(gè)name,如果作為命令名,它是如何被解釋的,如內(nèi)置命令、一般命令搜索路徑等。
7.unset命令
格式是:unset [ name … ]
刪除由name指定的相應(yīng)變量或函數(shù)。
應(yīng)注意,變量PATH,PS1,PS2,MAILCHECK和IFS不能被刪除,即不能受unset的作用。
8.umask命令
格式是umask [-S ] [ mask ]
將用戶(hù)文件創(chuàng)建掩碼設(shè)置為mask的值。
9.wait命令
格式是:wait [ n ]
等待由n(進(jìn)程 ID)指定的進(jìn)程終止,并報(bào)告終止?fàn)顟B(tài)。
4.13 shell腳本調(diào)試
通常采用自底向上的方法,即:先搞清楚要腳本做什么,然后將過(guò)程的連續(xù)階段分解為獨(dú)立的步驟,最后利用shell提示符,交互式地檢查和調(diào)試每個(gè)獨(dú)立的步驟。
編寫(xiě)的腳本無(wú)法執(zhí)行的原因除腳本文件缺少“執(zhí)行”權(quán)限外,有兩種可能:執(zhí)行腳本的環(huán)境設(shè)置不對(duì)和腳本本身有錯(cuò)誤。
4.13.1 解決環(huán)境設(shè)置問(wèn)題
① 不能直接在其他shell下運(yùn)行bash腳本,解決的辦法是在腳本的第一行寫(xiě)上:#!/bin/bash
② 在PATH環(huán)境變量中沒(méi)有包括“.”(當(dāng)前工作目錄)。
解決辦法是設(shè)置PATH:PATH=$PATH:.
③ 腳本文件與已存在命令的名字相同。
4.13.2 解決腳本錯(cuò)誤
基本的錯(cuò)誤類(lèi)型有兩種:語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤。
語(yǔ)法錯(cuò)誤是編寫(xiě)程序時(shí)違反了所用編程語(yǔ)言的規(guī)則而造成的。
邏輯錯(cuò)誤通常是由于程序的邏輯關(guān)系存在問(wèn)題。對(duì)此類(lèi)問(wèn)題需要進(jìn)行程序調(diào)試。
一個(gè)很有用的技巧是使用set命令打開(kāi)-x選項(xiàng),或者在啟動(dòng)shell時(shí)使用-x選項(xiàng)將shell設(shè)置成跟蹤模式。
另一個(gè)有用的技巧是在程序中經(jīng)常使用echo或print命令
作者: admin 時(shí)間: 2013-5-5 20:36
很好
歡迎光臨 WDlinux官方論壇 (http://www.fsowen.com/bbs/) |
Powered by Discuz! 7.2 |