Shell腳本編程基礎(chǔ)知識(shí)課件_第1頁(yè)
Shell腳本編程基礎(chǔ)知識(shí)課件_第2頁(yè)
Shell腳本編程基礎(chǔ)知識(shí)課件_第3頁(yè)
Shell腳本編程基礎(chǔ)知識(shí)課件_第4頁(yè)
Shell腳本編程基礎(chǔ)知識(shí)課件_第5頁(yè)
已閱讀5頁(yè),還剩70頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論