![Shell腳本編程基礎(chǔ)知識(shí)課件_第1頁(yè)](http://file4.renrendoc.com/view11/M02/27/21/wKhkGWWt5nKAJR-OAACT3dVJ42A971.jpg)
![Shell腳本編程基礎(chǔ)知識(shí)課件_第2頁(yè)](http://file4.renrendoc.com/view11/M02/27/21/wKhkGWWt5nKAJR-OAACT3dVJ42A9712.jpg)
![Shell腳本編程基礎(chǔ)知識(shí)課件_第3頁(yè)](http://file4.renrendoc.com/view11/M02/27/21/wKhkGWWt5nKAJR-OAACT3dVJ42A9713.jpg)
![Shell腳本編程基礎(chǔ)知識(shí)課件_第4頁(yè)](http://file4.renrendoc.com/view11/M02/27/21/wKhkGWWt5nKAJR-OAACT3dVJ42A9714.jpg)
![Shell腳本編程基礎(chǔ)知識(shí)課件_第5頁(yè)](http://file4.renrendoc.com/view11/M02/27/21/wKhkGWWt5nKAJR-OAACT3dVJ42A9715.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Linux操作系統(tǒng)Shell腳本編程Shell腳本編程基礎(chǔ)知識(shí)主要內(nèi)容和學(xué)習(xí)要求掌握創(chuàng)建shell
腳本的基本步驟學(xué)會(huì)使用條件測(cè)試掌握if
條件結(jié)構(gòu)與case
選擇結(jié)構(gòu)掌握f(shuō)or
循環(huán)、while
循環(huán)和until
循環(huán)結(jié)構(gòu)學(xué)會(huì)shift
命令的使用學(xué)會(huì)shell
腳本的調(diào)試Shell腳本編程基礎(chǔ)知識(shí)
Shell
腳本Shell腳本如果有一系列你經(jīng)常使用的Linux命令,你可以把它們存儲(chǔ)在一個(gè)文件里,shell可以讀取這個(gè)文件并順序執(zhí)行其中的命令,這樣的文件被稱為腳本文件。shell
腳本按行解釋。Shell腳本編程基礎(chǔ)知識(shí)
Shell腳本的編寫(xiě)
Shell
腳本是純文本文件,可以使用任何文本編輯器編寫(xiě)
Shell
腳本通常是以.sh作為后綴名
Shell腳本的執(zhí)行chmod
+x
script_name./script_namebash
script_nameShell腳本編程基礎(chǔ)知識(shí)
第一行:指定用哪個(gè)程序來(lái)編譯和執(zhí)行腳本。
Shell腳本的格式#!/bin/bash可執(zhí)行語(yǔ)句和shell
控制結(jié)構(gòu)注釋:以“#”開(kāi)頭,可獨(dú)占一行,或跟在語(yǔ)句的后面。Shell腳本#!/bin/sh#!/bin/csh一個(gè)shell
腳本通常由一組Linux
命令、shell
命令、控制結(jié)構(gòu)和注釋語(yǔ)句構(gòu)成。在腳本中多寫(xiě)注釋語(yǔ)句是一個(gè)很好的編程習(xí)慣Shell腳本編程基礎(chǔ)知識(shí)#!/bin/bash#ThisisthefirstBashshellprogram#ScriptName:greetings.shechoecho
–e"Hello$LOGNAME,\c"echo"it'snicetalkingtoyou."echo"Yourpresentworkingdirectoryis:"pwd#Showthenameofpresentdirectoryechoecho
–e"Thetimeis`date+%T`!.\nBye"echobash
greetings.shchmod+x
greetings.sh./greetingsShell腳本舉例Shell腳本編程基礎(chǔ)知識(shí)echo命令功能說(shuō)明:顯示文字。語(yǔ)法:echo[-ne][字符串]或echo[--help][--version]補(bǔ)充說(shuō)明:echo會(huì)將輸入的字符串送往標(biāo)準(zhǔn)輸出。輸出的字符串間以空白字符隔開(kāi),并在最后加上換行號(hào)。-n不進(jìn)行換行-e若字符串中出現(xiàn)以下字符,則特別加以處理,而不會(huì)將它當(dāng)成一般文字輸出
\n換行\(zhòng)b空格...Shell腳本編程基礎(chǔ)知識(shí)參數(shù):-n不要在最后自動(dòng)換行-e若字符串中出現(xiàn)以下字符,則特別加以處理,而不會(huì)將它當(dāng)成一般文字輸出:\a發(fā)出警告聲;\b刪除前一個(gè)字符;\c最后不加上換行符號(hào);\f換行但光標(biāo)仍舊停留在原來(lái)的位置;\n換行且光標(biāo)移至行首;\r光標(biāo)移至行首,但不換行;\t插入tab;\v與\f相同;\\插入\字符;\nnn插入nnn(八進(jìn)制)所代表的ASCII字符;--help顯示幫助--version顯示版本信息Shell腳本編程基礎(chǔ)知識(shí)#!/bin/bash#Thisscriptistotesttheusageofread#Scriptname:ex4read.shecho"===examplesfortestingread==="echo-e
"Whatisyourname?\c"readnameecho"Hello$name"echoecho-n"Wheredoyouwork?"readecho"Iguess$REPLYkeepsyoubusy!"echoread-p
"Enteryourjobtitle:"#自動(dòng)讀給REPLYecho"Ithoughtyoumightbean$REPLY."echoecho"===Endofthescript==="Shell腳本舉例Shell腳本編程基礎(chǔ)知識(shí)read命令readvariable#讀取變量給variablereadxy#可同時(shí)讀取多個(gè)變量read#自動(dòng)讀給REPLYread–p“Pleaseinput:”
#自動(dòng)讀給REPLYShell腳本編程基礎(chǔ)知識(shí)狀態(tài)變量$?中保存命令退出狀態(tài)的值grep$USER
/etc/passwd
echo$?grephello
/etc/passwd;echo$?條件測(cè)試條件測(cè)試可以根據(jù)某個(gè)特定條件是否滿足,來(lái)選擇執(zhí)行相應(yīng)的任務(wù)。
Bash
中允許測(cè)試兩種類型的條件:
命令成功或失敗,表達(dá)式為真或假任何一種測(cè)試中,都要有退出狀態(tài)(返回值),退出狀態(tài)為0表示命令成功或表達(dá)式為真,非0則表示命令失敗或表達(dá)式為假。Shell腳本編程基礎(chǔ)知識(shí)
內(nèi)置測(cè)試命令
test通常用test
命令來(lái)測(cè)試表達(dá)式的值x=5;y=10test$x
-gt
$yecho$?
test
命令可以用方括號(hào)來(lái)代替x=5;y=10[
$x
-gt$y]
echo$?
表達(dá)式測(cè)試包括字符串測(cè)試、整數(shù)測(cè)試和文件測(cè)試。測(cè)試表達(dá)式的值方括號(hào)前后要留空格!Shell腳本編程基礎(chǔ)知識(shí)name=Tom
[$name
=[Tt]??
]
echo$?
2.x
版本以上的Bash
中可以用雙方括號(hào)來(lái)測(cè)試表達(dá)式的值,此時(shí)可以使用通配符進(jìn)行模式匹配。測(cè)試表達(dá)式的值[[$name
=[Tt]??
]]
echo$?Shell腳本編程基礎(chǔ)知識(shí)字符串測(cè)試[
-z
str]如果字符串str長(zhǎng)度為0,返回真[
-n
str]如果字符串str長(zhǎng)度不為0,返回真[
str1
=
str2
]兩字符串相等[
str1
!=
str2
]兩字符串不等name=Tom;[-z$name];
echo$?操作符兩邊必須留空格!字符串測(cè)試name2=Andy;[$name
=$name2
]
;
echo$?Shell腳本編程基礎(chǔ)知識(shí)
整數(shù)測(cè)試,即比較大小[int1
-eq
int2
]int1等于int2[int1
-ne
int2
]int1不等于int2[int1
-gt
int2
]int1大于int2[int1
-ge
int2
]int1大于或等于int2[int1
-lt
int2
]int1小于int2[int1
-le
int2
]int1小于或等于int2x=1;[$x
-eq
1
];
echo$?x=a;[$x
-eq
1
];
echo$?整數(shù)測(cè)試操作符兩邊必須留空格!XShell腳本編程基礎(chǔ)知識(shí)整數(shù)測(cè)試也可以使用let
命令或雙圓括號(hào)x=1;let
"$x
==
1";
echo$?x=1;(($x+1>=2));
echo$?只能用于整數(shù)測(cè)試!整數(shù)測(cè)試相應(yīng)的操作符為:==
、!=
、>
、>=
、<
、<=例:兩種測(cè)試方法的區(qū)別使用的操作符不同
let
和雙圓括號(hào)中可以使用算術(shù)表達(dá)式,而中括號(hào)不能
let
和雙圓括號(hào)中,操作符兩邊可以不留空格Shell腳本編程基礎(chǔ)知識(shí)邏輯測(cè)試[
expr1
-a
expr2
]邏輯與,都為真時(shí),結(jié)果為真[
expr1
-o
expr2
]邏輯或,有一個(gè)為真時(shí),結(jié)果為真[
!
expr
]邏輯非x=1;name=Tom;[$x
-eq
1–a–n$name
];
echo$?邏輯測(cè)試注:不能隨便添加括號(hào)[
(
$x
-eq
1
)–a(
–n$name
)
];
echo$?XShell腳本編程基礎(chǔ)知識(shí)x=1;name=Tom;[[$x
-eq
1&&$name=To?
]];
echo$?[[
pattern1
&&
pattern2
]]邏輯與
[[
pattern1
||
pattern2
]]邏輯或
[[
!
pattern
]]邏輯非
可以使用模式的邏輯測(cè)試邏輯測(cè)試Shell腳本編程基礎(chǔ)知識(shí)文件測(cè)試:文件是否存在,文件屬性,訪問(wèn)權(quán)限等。-ffnamefname存在且是普通文件時(shí),返回真(即返回0)
-Lfnamefname存在且是鏈接文件時(shí),返回真
-d
fnamefname存在且是一個(gè)目錄時(shí),返回真
-e
fnamefname(文件或目錄)存在時(shí),返回真
-s
fnamefname存在且大小大于0時(shí),返回真
-r
fnamefname(文件或目錄)存在且可讀時(shí),返回真
-w
fnamefname(文件或目錄)存在且可寫(xiě)時(shí),返回真
-x
fnamefname(文件或目錄)存在且可執(zhí)行時(shí),返回真常見(jiàn)的文件測(cè)試操作符更多文件測(cè)試符參見(jiàn)test
的在線幫助mantest文件測(cè)試Shell腳本編程基礎(chǔ)知識(shí)檢查空值[
"$name"
=
""][!
"$name"][
"X${name}"
!=
"X"]檢查空值Shell腳本編程基礎(chǔ)知識(shí)語(yǔ)法結(jié)構(gòu)ifexpr1#如果expr1為真(返回值為0)then#那么
commands1#執(zhí)行語(yǔ)句塊commands1elif
expr2#若expr1不真,而expr2為真then#那么
commands2#執(zhí)行語(yǔ)句塊commands2......
#可以有多個(gè)elif語(yǔ)句else#else最多只能有一個(gè)
commands4#執(zhí)行語(yǔ)句塊commands4fi#
if語(yǔ)句必須以單詞fi
終止if條件語(yǔ)句Shell腳本編程基礎(chǔ)知識(shí)
commands
為可執(zhí)行語(yǔ)句塊,如果為空,需使用shell
提供的空命令“:”,即冒號(hào)。該命令不做任何事情,只返回一個(gè)退出狀態(tài)0
if
語(yǔ)句可以嵌套使用
ex4if.sh,chkperm.sh,chkperm2.sh,
name_grep,tellme,tellme2,idcheck.sh幾點(diǎn)說(shuō)明
elif
可以有任意多個(gè)(0個(gè)或多個(gè))
else
最多只能有一個(gè)(0個(gè)或1個(gè))
if
語(yǔ)句必須以fi
表示結(jié)束
expr
通常為條件測(cè)試表達(dá)式;也可以是多個(gè)命令,以最后一個(gè)命令的退出狀態(tài)為條件值。Shell腳本編程基礎(chǔ)知識(shí)ex4if.sh#!/bin/bash#scriptname:ex4if.sh#echo-n"Pleaseinputx,y:"readxyecho"x=$x,y=$y"if((x>y));thenecho"xislargerthany"elif((x==y));thenecho"xisequaltoy"elseecho"xislessthany"fiShell腳本編程基礎(chǔ)知識(shí)chkperm.sh#!/bin/bash#Usingtheoldstyletestcommand:[]#:perm_check.sh#if[-d$file]thenecho"$adirectory"elif[-f$file]thenif[-r$-w$-x$file]then#nestedifcommandecho"Youhaveread,write,andexecutepermissionon$file."fielseecho"$neitheraadirectory."fiShell腳本編程基礎(chǔ)知識(shí)chkperm2.sh#!/bin/bash#Usingthenewstyletestcommand:[[]]#:perm_check2.sh#if[[-d$file]]thenecho"$adirectory"elif[[-f$file]]thenif[[-r$-w$-x$file]]then#nestedifcommandecho"Youhaveread,write,andexecutepermissionon$file."fielseecho"$neitheraadirectory."fiShell腳本編程基礎(chǔ)知識(shí)name_grep#!/bin/bash#:name_grep#name=Tomifgrep"$name"/etc/passwd>&/dev/nullthen:elseecho"$namenotfoundin/etc/passwd"exit2fiShell腳本編程基礎(chǔ)知識(shí)tellme#!/bin/bashecho-n"Howoldareyou?"readageif[$age-lt0-o$age-gt120]then echo"Welcometoourplanet!" exit1fiif[$age-ge0-a$age-le12]then echo"Childrenistheflowersofthecountry"elif[$age-gt12-a$age-le19]then echo"Rebelwithoutacause"elif[$age-gt19-a$age-le29]then echo"Yougottheworldbythetail!!"elif[$age-ge30-a$age-le39]then echo"Thirtysomething..."else echo"SorryIasked"fiShell腳本編程基礎(chǔ)知識(shí)tellme2#!/bin/bashecho-n"Howoldareyou?"readageif((age<0||age>120))then echo"Welcometoourplanet!" exit1fiif((age>=0&&age<=12))then echo"Childrenistheflowersofthecountry"elif((age>=13&&age<=19))thenecho"Rebelwithoutacause"elif((age>=19&&age<=29))then echo"Yougottheworldbythetail!!"elif((age>=30&&age<=39))then echo"Thirtysomething..."else echo"SorryIasked"fiShell腳本編程基礎(chǔ)知識(shí)idcheck.sh#!/bin/bash#Scriptname:idcheck.sh#purpose:checkuseridtoseeifuserisroot.#Onlyroothasauidof0.#Formatforidoutput:uid=501(tt)gid=501(tt)groups=501(tt)#root’suid=0:uid=0(root)gid=0(root)groups=0(root)…#id=`id|awk-F'[=(]''{print$2}'`#getuseridecho"youruseridis:$id"if((id==0))#[$id-eq0]then echo"youaresuperuser."else echo"youarenotsuperuser."fiShell腳本編程基礎(chǔ)知識(shí)語(yǔ)法結(jié)構(gòu)caseexpr
in#expr
為表達(dá)式,關(guān)鍵詞
in
不要忘!
pattern1)#若
expr
與
pattern1
匹配,注意括號(hào)
commands1#執(zhí)行語(yǔ)句塊
commands1;;#跳出
case
結(jié)構(gòu)
pattern2)#若
expr
與
pattern2
匹配
commands2#執(zhí)行語(yǔ)句塊
commands2;;#跳出
case
結(jié)構(gòu)
......
#可以有任意多個(gè)模式匹配
*)#若
expr
與上面的模式都不匹配
commands#執(zhí)行語(yǔ)句塊
commands;;#跳出
case
結(jié)構(gòu)
esac#case
語(yǔ)句必須以
esac
終止case選擇語(yǔ)句Shell腳本編程基礎(chǔ)知識(shí)
case
語(yǔ)句舉例:yes_no.sh幾點(diǎn)說(shuō)明每個(gè)命令塊的最后必須有一個(gè)雙分號(hào),可以獨(dú)占一行,或放在最后一個(gè)命令的后面。所給的匹配模式pattern
中可以含有通配符和“|”。如果expr
沒(méi)有找到匹配的模式,則執(zhí)行缺省值“*)”后面的命令塊(類似于if
中的else);“*)”可以不出現(xiàn)。表達(dá)式expr
按順序匹配每個(gè)模式,一旦有一個(gè)模式匹配成功,則執(zhí)行該模式后面的所有命令,然后退出case。Shell腳本編程基礎(chǔ)知識(shí)yes_no.sh#!/bin/bash#testcase#scriptname:yes_no.sh#echo-n"Doyouwishtoproceed[y/n]:"readanscase$ansiny|Y|yes|Yes)echo"yesisselected";;n|N|no|No)echo"noisselected" ;;*)echo"`basename$0`:Unknownresponse" exit1;;esacShell腳本編程基礎(chǔ)知識(shí)語(yǔ)法結(jié)構(gòu)forvariable
in
list
#每一次循環(huán),依次把列表
list
中的一個(gè)值賦給循環(huán)變量do#循環(huán)開(kāi)始的標(biāo)志
commands#循環(huán)變量每取一次值,循環(huán)體就執(zhí)行一遍done#循環(huán)結(jié)束的標(biāo)志幾點(diǎn)說(shuō)明列表list
可以是命令替換、變量名替換、字符串和文件名列表(可包含通配符)
for
循環(huán)執(zhí)行的次數(shù)取決于列表list
中單詞的個(gè)數(shù)
for
循環(huán)體中一般要出現(xiàn)循環(huán)變量,但也可以不出現(xiàn)for循環(huán)語(yǔ)句Shell腳本編程基礎(chǔ)知識(shí)執(zhí)行第一輪循環(huán)時(shí),將list
中的第一個(gè)詞賦給循環(huán)變量,并把該詞從list
中刪除,然后進(jìn)入循環(huán)體,執(zhí)行do和done
之間的命令。下一次進(jìn)入循環(huán)體時(shí),則將第二個(gè)詞賦給循環(huán)變量,并把該詞從list
中刪除,再往后的循環(huán)也以此類推。當(dāng)list
中的詞全部被移走后,循環(huán)就結(jié)束了。循環(huán)執(zhí)行過(guò)程forloop.sh,mybackup.sh
位置參量的使用:
$*與
$@
greet.sh
可以省略
inlist
,此時(shí)使用位置參量permx.shidcheck.shgreet.shyes_no.shpermx.sh*.shfor循環(huán)執(zhí)行過(guò)程Shell腳本編程基礎(chǔ)知識(shí)forloop.sh#!/bin/bash#Scriptname:forloop.shfornameinTomDickHarryJoedoecho"Hi$name"doneecho"outofloop"Shell腳本編程基礎(chǔ)知識(shí)forloop2.sh#!/bin/bash#Scriptname:forloop2.shfornamein`catnamelist`doecho"Hi$name"doneecho"outofloop"Shell腳本編程基礎(chǔ)知識(shí)mybackup.sh#!/bin/bash#Scriptname:mybackup.sh#Purpose:Createbackupfilesandstore#theminabackupdirectory.#backup_dir=backupmkdir$backup_dirfor*.shdoif[-f$file]thencp$file$backup_dir/${echo"$backedupin$backup_dir"fidoneShell腳本編程基礎(chǔ)知識(shí)greet.sh#!/bin/bash#Scriptname:greet.sh#usage:greet.shTomJohnAnndyecho"==using\$*=="fornamein$*#sameasfornamein$@doechoHi$namedoneecho"==using\$@=="fornamein$@#sameasfornamein$*doechoHi$namedoneecho'==using"$*"=='fornamein"$*"doechoHi$namedoneecho'==using"$@"=='fornamein"$@"doechoHi$namedoneShell腳本編程基礎(chǔ)知識(shí)permx.sh#!/bin/bash#Scriptname:permx.sh#forfile#Emptywordlistdoif[[-f$!-x$file]]thenchmod+x$fileecho"==$hasexecutepermission"fidoneShell腳本編程基礎(chǔ)知識(shí)語(yǔ)法結(jié)構(gòu)whileexpr#執(zhí)行
exprdo#若
expr
的退出狀態(tài)為0,進(jìn)入循環(huán),否則退出whilecommands#循環(huán)體done#循環(huán)結(jié)束標(biāo)志,返回循環(huán)頂部執(zhí)行過(guò)程先執(zhí)行expr,如果其退出狀態(tài)為0,就執(zhí)行循環(huán)體。執(zhí)行到關(guān)鍵字done
后,回到循環(huán)的頂部,while
命令再次檢查expr
的退出狀態(tài)。以此類推,循環(huán)將一直繼續(xù)下去,直到expr
的退出狀態(tài)非0為止。while循環(huán)語(yǔ)句Shell腳本編程基礎(chǔ)知識(shí)語(yǔ)法結(jié)構(gòu)untilexpr#執(zhí)行exprdo#若expr的退出狀態(tài)非0,進(jìn)入循環(huán),否則退出untilcommands#循環(huán)體done#循環(huán)結(jié)束標(biāo)志,返回循環(huán)頂部執(zhí)行過(guò)程與while
循環(huán)類似,只是當(dāng)expr
退出狀態(tài)非0時(shí)才執(zhí)行循環(huán)體,直到expr
為0時(shí)退出循環(huán)。until循環(huán)語(yǔ)句Shell腳本編程基礎(chǔ)知識(shí)用于強(qiáng)行退出當(dāng)前循環(huán)。如果是嵌套循環(huán),則break
命令后面可以跟一數(shù)字n,表示退出第n
重循環(huán)(最里面的為第一重循環(huán))。用于忽略本次循環(huán)的剩余部分,回到循環(huán)的頂部,繼續(xù)下一次循環(huán)。如果是嵌套循環(huán),continue
命令后面也可跟一數(shù)字n,表示回到第n
重循環(huán)的頂部。break
[n]continue
[n]例:months.shbreak和continueShell腳本編程基礎(chǔ)知識(shí)months.sh#!/bin/bash#Scriptname:months.shformonthinJanFebMarAprMayJunJulAugSepOctNovDecdoforweekin1234doecho-n"Processingthemonthof$month.OK?"readansif["$ans"=n-o-z"$ans"]thencontinue2elseShell腳本編程基礎(chǔ)知識(shí)echo-n"Processweek$weekof$month?"readansif["$ans"=n-o-z"$ans"]thencontinueelseecho"Nowprocessingweek$weekof$month."sleep1#Commandsgohereecho"Doneprocessing..."fifidonedoneShell腳本編程基礎(chǔ)知識(shí)sleepnexit和sleepexitnexit
命令用于退出腳本或當(dāng)前進(jìn)程。n
是一個(gè)從0到255的整數(shù),0表示成功退出,非零表示遇到某種失敗而非正常退出。該整數(shù)被保存在狀態(tài)變量$?中。
exit
命令
sleep
命令暫停n
秒鐘Shell腳本編程基礎(chǔ)知識(shí)語(yǔ)法結(jié)構(gòu)說(shuō)明
select
循環(huán)主要用于創(chuàng)建菜單,按數(shù)字順序排列的菜單項(xiàng)將顯示在標(biāo)準(zhǔn)錯(cuò)誤上,并顯示PS3
提示符,等待用戶輸入用戶輸入菜單列表中的某個(gè)數(shù)字,執(zhí)行相應(yīng)的命令用戶輸入被保存在內(nèi)置變量REPLY
中。selectvariable
in
list
do#循環(huán)開(kāi)始的標(biāo)志
commands#循環(huán)變量每取一次值,循環(huán)體就執(zhí)行一遍done#循環(huán)結(jié)束的標(biāo)志例:runit.shselect循環(huán)與菜單Shell腳本編程基礎(chǔ)知識(shí)runit.sh#!/bin/bash#Scriptname:runit.shPS3="Selectaprogramtoexecute:"selectprogramin'ls-F'pwddatedo $programdoneShell腳本編程基礎(chǔ)知識(shí)例:goodboy.sh
select
經(jīng)常和case
聯(lián)合使用
select
是個(gè)無(wú)限循環(huán),因此要記住用break
命令退出循環(huán),或用exit
命令終止腳本。也可以按ctrl+c
退出循環(huán)。與for
循環(huán)類似,可以省略inlist
,此時(shí)使用位置參量select與caseShell腳本編程基礎(chǔ)知識(shí)goodboy.sh#!/bin/bash#Scriptname:goodboys.shPS3="Pleasechooseoneofthethreeboys:"selectchoiceintomdanguy#selectchoicedocase$choiceintom)echoTomisacooldude!break;; #breakoutoftheselectloopdan|guy)echoDanandGuyarebothwonderful.break;;*)echo"$REPLYisnotoneofyourchoices"echo"Tryagain.";;esacdoneShell腳本編程基礎(chǔ)知識(shí)shift
[n]用于將參量列表list
左移指定次數(shù),缺省為左移一次。參量列表list
一旦被移動(dòng),最左端的那個(gè)參數(shù)就從列表中刪除。while
循環(huán)遍歷位置參量列表時(shí),常用到shift。./doit.shabcdefgh./shft.shabcdefgh循環(huán)控制shift命令例:Shell腳本編程基礎(chǔ)知識(shí)doit.sh#!/bin/bash#Name:doit.sh#Purpose:shiftthroughcommandlinearguments#Usage:doit.sh[args]while(($#>0))#or[$#-gt0]doecho$*shiftdoneShell腳本編程基礎(chǔ)知識(shí)shft.sh#!/bin/bash#Using'shift'tostepthroughallthepositionalparameters.until[-z"$1"]#Untilallparametersusedup...doecho"$1"shiftdoneecho#Extralinefeed.exit0Shell腳本編程基礎(chǔ)知識(shí)
生成隨機(jī)數(shù)的特殊變量echo$RANDOM范圍是:[0,32767]
expr:通用的表達(dá)式計(jì)算命令表達(dá)式中參數(shù)與操作符必須以空格分開(kāi),表達(dá)式中的運(yùn)算可以是算術(shù)運(yùn)算,比較運(yùn)算,字符串運(yùn)算和邏輯運(yùn)算。expr5%3expr5\*3#乘法符號(hào)必須被轉(zhuǎn)義隨機(jī)數(shù)和expr命令Shell腳本編程基礎(chǔ)知識(shí)字符串操作${#var}返回字符串變量var的長(zhǎng)度${var:m}返回${var}中從第m個(gè)字符到最后的部分${var:m:len}返回${var}中從第m個(gè)字符開(kāi)始,長(zhǎng)度為len的部分${var#pattern}刪除${var}中開(kāi)頭部分與pattern匹配的最小部分${var##pattern}刪除${var}中開(kāi)頭部分與pattern匹配的最大部分${var%pattern}刪除${var}中結(jié)尾部分與pattern匹配的最小部分${var%%pattern}刪除${var}中結(jié)尾部分與pattern匹配的最大部分${var/old/new}用new替換${var}中第一次出現(xiàn)的old${var//old/new}用new替換${var}中所有的old(全局替換)注:pattern,old中可以使用通配符。例:ex4strm的取值從0到${#var}-1字符串操作Shell腳本編程基礎(chǔ)知識(shí)ex4str#!/bin/bashdirname="/usr/bin/local/bin";echo"dirname=$dirname"echo-n'${#dirname}=';sleep4;echo"${#dirname}"echoecho-n'${dirname:4}=';sleep4;echo"${dirname:4}"echoecho-n'${dirname:8:6}=';sleep4;echo${dirname:8:6}echoecho-n'${dirname#*bin}=';sleep4;echo${dirname#*bin}echoecho-n'${dirname##*bin}=';sleep4;echo${dirname##*bin}echoecho-n'${dirname%bin}=';sleep4;echo${dirname%bin}echoecho-n'${dirname%%bin}=';sleep4;echo${dirname%%bin}echoecho-n'${dirname%bin*}=';sleep4;echo${dirname%bin*}echoecho-n'${dirname%%bin*}=';echo${dirname%%bin*}echoecho-n'${dirname/bin/sbin}=';echo${dirname/bin/sbin}echoecho-n'${dirname//bin/lib}=';echo${dirname//bin/lib}echoecho-n'${dirname/bin*/lib}=';echo${dirname/bin*/lib}Shell腳本編程基礎(chǔ)知識(shí)sh
–x
腳本名該選項(xiàng)可以使用戶跟蹤腳本的執(zhí)行,此時(shí)shell
對(duì)腳本中每條命令的處理過(guò)程為:先執(zhí)行替換,然后顯示,再執(zhí)行它。shell
顯示腳本中的行時(shí),會(huì)在行首添加一個(gè)加號(hào)“+”。sh–v
腳本名在執(zhí)行腳本之前,按輸入的原樣打印腳本中的各行,打印一行執(zhí)行一行。sh–n
腳本名對(duì)腳本進(jìn)行語(yǔ)法檢查,但不執(zhí)行腳本。如果存在語(yǔ)法錯(cuò)誤,shell
會(huì)報(bào)錯(cuò),如果沒(méi)有錯(cuò)誤,則不顯示任何內(nèi)容。腳本調(diào)試Shell腳本編程基礎(chǔ)知識(shí)編程小結(jié):變量局部變量、環(huán)境變量(export、declare-x)只讀變量、整型變量例:declare
-ix;x="hello";
echo$x0位置參量($0,$1,...,$*,$@,$#,$$,$?)變量的間接引用(eval,
${!str})例:name="hello";x="name";
echo${!x}hello命令替換(`cmd`、$(cmd))整數(shù)運(yùn)算
declare
定義的整型變量可以直接進(jìn)行運(yùn)算,
否則需用let
命令或$[...]、$((...))進(jìn)行整數(shù)運(yùn)算。Shell腳本編程基礎(chǔ)知識(shí)編程小結(jié):輸入輸出
輸入:readreadvar1var2...readread–p
"提示"輸出:printfprintf"%-12.5f\t%d\n"123.458format
以%開(kāi)頭flagfieldwidthprecision格式符-:左對(duì)齊+:輸出符號(hào)0:空白處添0空格:前面加一空格字段寬度小數(shù)點(diǎn)后輸出位數(shù)cdefgsox\b\n\r\t\v\\\”%%
REPLY
REPLY輸出參數(shù)用空格隔開(kāi)Shell腳本編程基礎(chǔ)知識(shí)字符串測(cè)試編程小結(jié):條件測(cè)試[
-z
string
]如果字符串string長(zhǎng)度為0,返回真[
-n
string
]如果字符串string長(zhǎng)度不為0,返回真[
str1
=
str2
]兩字符串相等(也可以使用==)[
str1
!=
str2
]兩字符串不等操作符兩邊必須留空格![[
str1
=
str2
]]兩字符串相等(也可以使用==)[[
str1
!=
str2
]]兩字符串不等[[
str1
>
str2
]]str1大于str2,按ASCII碼比較[[
str1
<
str2
]]str1小于str2,按ASCII碼比較如果使用雙方括號(hào),可以使用通配符進(jìn)行模式匹配。例:name=Tom;[[$name>Tom]];
echo$?Shell腳本編程基礎(chǔ)知識(shí)編程小結(jié):條件測(cè)試整數(shù)測(cè)試[
int1
-eq
int2
]int1等于int2[
int1
-ne
int2
]int1不等于int2[
int1
-gt
int2
]int1大于int2[
int1
-ge
int2
]int1大于或等于int2[
int1
-lt
int2
]int1小于int2[
int1
-le
int2
]int1小于或等于int2注意這兩種方法的區(qū)別![[int1==int2]]int1等于int2[[int1!=int2]]int1不等于int2[[int1
>
int2]]int1大于int2[[int1
>=int2]]int1大于或等于int2[[int1
<
int2]]int1小于int2[[int1<=int2]]int1小于或等于int2Shell腳本編程基礎(chǔ)知識(shí)編程小結(jié):條件測(cè)試邏輯測(cè)試如果使用雙方括號(hào),可以使用通配符進(jìn)行模式匹配。[[
pattern1
&&
pattern2
]]邏輯與
[[
pattern1
||
pattern2
]]邏輯或
[[
!
pattern
]]邏輯非
[
expr1
-a
expr2
]邏輯與,都為真時(shí),結(jié)果為真[
expr1
-o
expr2
]邏輯或,有一個(gè)為真時(shí),結(jié)果為真[
!
expr
]邏輯非Shell腳本編程基礎(chǔ)知識(shí)編程小結(jié):條件測(cè)試文件測(cè)試-ffnamefname存在且是普通文件時(shí),返回真(即返回0)
-Lfnamefname存在且是鏈接文件時(shí),返回真
-d
fnamefname存在且是一個(gè)目錄時(shí),返回真
-e
fnamefname(文件或目錄)存在時(shí),返回真
-s
fnamefname存在且大小大于0時(shí),返回真
-r
fnamefname(文件或目錄)存在且可讀時(shí),返回真
-w
fnamefname(文件或目錄)存在且可寫(xiě)時(shí),返回真
-x
fnamefname(文件或目錄)存在且可執(zhí)行時(shí),返回真Shell腳本編程基礎(chǔ)知識(shí)編程小結(jié):控制結(jié)構(gòu)
if
條件語(yǔ)句
case
選擇語(yǔ)句
for
循環(huán)語(yǔ)句
while
循環(huán)語(yǔ)句
until
循環(huán)語(yǔ)句
break、continue、sleep
命令
select循環(huán)與菜單
shift命令
${...},$(...),$[...],$((...))[...],[[...]],((...))各種括號(hào)的作用Shell腳本編程基礎(chǔ)知識(shí)function_name(){commands}函數(shù)
一個(gè)函數(shù)就是一個(gè)子程序,用于完成特定的任務(wù),當(dāng)有重復(fù)代碼,或者一個(gè)任務(wù)只需要很少的修改就被重復(fù)幾次執(zhí)行時(shí),這時(shí)你應(yīng)考慮使用函數(shù)。functionfunction_name{commands}
函數(shù)的一般格式
和其它編程語(yǔ)言一樣,Bash也可以定義函數(shù)。Shell腳本編程基礎(chǔ)知識(shí)函數(shù)舉例#!/bin/bashfun1(){echo"Thisisafunction"echo
"Nowexitingfun1."
}fun2(){echo"Thisisfun2."echo"Nowexitingfun2."}Shell腳本編程基礎(chǔ)知識(shí)
只需輸入函數(shù)名即可調(diào)用該函數(shù)。函數(shù)的調(diào)用
函數(shù)必須在調(diào)用之前定義#!/bin/bashfun2(){echo"Thisisfun2."echo"Nowexitingfun2."}fun2#調(diào)用函數(shù)
fun2例:ex4fun2.sh,ex4fun3.shShell腳本編程基礎(chǔ)知識(shí)ex4fun2.sh#!/bin/bashJUST_A_SECOND=1fun(){#Asomewhatmorecomplexfunctioni=0REPEATS=5echoecho"Andnowthefunreallybegins."echosleep$JUST_A_SECOND#Hey,waitasecond!while[$i-lt$REPEATS]doecho"----------FUNCTIONS---------->"echo"<------------ARE-------------"echo"<------------FUN------------>"echolet"i+=1"done}#Now,callthefunctions.funexit0Shell腳本編程基礎(chǔ)知識(shí)ex4fun3.sh#f1#Willgiveanerrormessage,sincefunction"f1"notyetdefined.#declare-ff1#Thisdoesn'thelpeither.#f1#Stilla
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《13潔凈的水域》說(shuō)課稿-2023-2024學(xué)年科學(xué)六年級(jí)下冊(cè)蘇教版
- Unit 2 Months of a Year Lesson Three(說(shuō)課稿)-2024-2025學(xué)年重大版英語(yǔ)六年級(jí)上冊(cè)
- Unit 6 Chores Lesson 4 Let's spell(說(shuō)課稿)-2024-2025學(xué)年人教新起點(diǎn)版英語(yǔ)五年級(jí)上冊(cè)001
- 2025水泥磚銷售合同范文
- 2024年七年級(jí)數(shù)學(xué)下冊(cè) 第10章 一元一次不等式和一元一次不等式組10.4一元一次不等式的應(yīng)用說(shuō)課稿(新版)冀教版
- 中型臭氧設(shè)備購(gòu)買合同范例
- 8 安全地玩(說(shuō)課稿)-部編版道德與法治二年級(jí)下冊(cè)
- 農(nóng)業(yè)設(shè)備供貨合同范例
- 冷庫(kù)設(shè)備購(gòu)銷合同范例
- 個(gè)人借還款合同范例
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)教程PPT全套完整教學(xué)課件
- 小學(xué)科學(xué)項(xiàng)目化作業(yè)的設(shè)計(jì)與實(shí)施研究
- 2023年考研考博-考博英語(yǔ)-西安建筑科技大學(xué)考試歷年真題摘選含答案解析
- 2020年中考生物試卷及答案
- 反接制動(dòng)控制線路電路圖及工作原理
- MCNP-5A程序使用說(shuō)明書(shū)
- java基礎(chǔ)知識(shí)大全
- SMM英國(guó)建筑工程標(biāo)準(zhǔn)計(jì)量規(guī)則中文 全套
- GB 18030-2022信息技術(shù)中文編碼字符集
- SB/T 10977-2013倉(cāng)儲(chǔ)作業(yè)規(guī)范
- 弘揚(yáng)中華傳統(tǒng)文化課件
評(píng)論
0/150
提交評(píng)論