UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇).ppt
《UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇).ppt》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇).ppt(146頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
UnixShell編程基礎(chǔ)篇 北京神州數(shù)碼思特奇信息技術(shù)股份有限公司研究院 課程目標(biāo) 熟練編寫(xiě)UnixShell程序 內(nèi)容提綱 Shell介紹Shell腳本介紹Shell特性正則表達(dá)式變量與運(yùn)算符Shell的輸入與輸出Shell函數(shù)腳本調(diào)試高級(jí)編程技巧Shell工具 SHELL介紹 Shell UNIX命令解釋器 問(wèn)題引入 DOS系統(tǒng)的命令由command負(fù)責(zé)執(zhí)行 并且對(duì)重覆性或多個(gè)命令運(yùn)行可寫(xiě)成批處理文件 只要執(zhí)行這個(gè)批處理文件就等於執(zhí)行這些命令 UNIX系統(tǒng)如何處理 Shell shell是一種命令語(yǔ)言 同時(shí)又是一種程序設(shè)計(jì)語(yǔ)言 UNIX系統(tǒng)利用shell命令解釋器 command languageinterpreter 完成用戶(hù)輸入命令的執(zhí)行 是用戶(hù)與系統(tǒng)交互的界面 是命令與kernel之間的接口 shell接收用戶(hù)輸入的命令 對(duì)命令作出解釋 然后發(fā)送給kernel執(zhí)行之 shell是一個(gè)解釋型的程序設(shè)計(jì)語(yǔ)言 shell程序 腳本 相當(dāng)于dos的批處理文件 可簡(jiǎn)單到只有一條命令 也可以包括循環(huán) 條件語(yǔ)句 數(shù)學(xué)運(yùn)算 控制結(jié)構(gòu)的程序 完成復(fù)雜的管理任務(wù) Shell UNIX命令解釋器 SHELL腳本介紹 Shell腳本介紹 為什么使用Shell腳本 批量命令重復(fù) 條件等控制Shell腳本的基本內(nèi)容 bin sh第一行注釋 第二行變量第三行條件判斷 循環(huán)第四行腳本的運(yùn)行方式chmod x腳本 腳本文件名 Shell腳本介紹 示例 hello sh bin bash 這是一個(gè)基本的shell腳本op helloworld echo op SHELL特性 Shell特性 別名命令替換管道重定向后臺(tái)處理模式匹配變量特殊字符 別名 aliasEg aliasll ls alh 命令替換 myfile的內(nèi)容如下 marmfindfile實(shí)現(xiàn)替換如下 ls catmyfile al 后臺(tái)處理 什么是后臺(tái) 一個(gè)終端可以同時(shí)運(yùn)行多個(gè)程序用法 nohupcommand 可以再后臺(tái)運(yùn)行此命令示例 nohubtar czf要壓縮的文件名壓縮后的文件名 查看后臺(tái)命令使用 jobs l 變量 示例 bin bash 這是一個(gè)基本的shell腳本printchar helloworld echo printchar變量用來(lái)存儲(chǔ)信息 管道 把一個(gè)命令的輸出連接到另一個(gè)命令的輸入 示例 ls sortcatfunc txt grep v 重定向 與管道相關(guān) 可以改變程序運(yùn)行的輸入來(lái)源和輸出地點(diǎn)示例 sortmyfile test txt 模式匹配 顯示以txt為擴(kuò)展名的文件或顯示以a開(kāi)頭的文件 這種情況稱(chēng)為模式匹配 實(shí)現(xiàn)方式 正則表達(dá)式如 ls txt 特殊字符 分號(hào) 允許在一行上放多個(gè)命令 eg cd backup mkdirstartup cp startup doecho xx x 1 doneexit0 特殊字符 兩個(gè)星號(hào)在運(yùn)算時(shí)代表 次方 的意思eg sus 2 3 echo sus sus sus 8 大括號(hào) 用法一 通配符擴(kuò)展eg lsmy finger toe s這條命令相當(dāng)于如下命令的組合 lsmy fingersmy toeseg mkdir userA userB userC home bin data 用法二 可用于語(yǔ)句塊的構(gòu)造 string 單引號(hào)和 string 雙引號(hào)雙引號(hào) 如果想在定義的變量中加入空格 就必須使用單引號(hào)或雙引號(hào) 單 雙引號(hào)的區(qū)別在于雙引號(hào)轉(zhuǎn)義特殊字符而單引號(hào)不轉(zhuǎn)義特殊字符eg heyyou home echo heyyou heyyou 沒(méi)有轉(zhuǎn)義 eg heyyou home echo heyyou home 轉(zhuǎn)義了輸出了heyyou變量的值 特殊字符 單引號(hào) 由單引號(hào)括起來(lái)的字符都作為普通字符出現(xiàn) 特殊字符用單引號(hào)括起來(lái)以后 也會(huì)失去原有意義 而只作為普通字符解釋 例如 單引號(hào) 由雙引號(hào)括起來(lái)的字符 除 和 這幾個(gè)字符仍是特殊字符并保留其特殊功能外 其余字符仍作為普通字符對(duì)待 root localhost String PATH PATH root localhost echo String usr kerberos sbin usr kerberos bin usr local sbin usr local bin sbin bin usr sbin usr bin usr X11R6 bin root bin PATH 特殊字符 雙引號(hào) 用來(lái)使shell無(wú)法認(rèn)出空格 制表符和其他大多數(shù)特殊字符 這樣 DavidMedinets 表示一個(gè)值 讓 反斜杠反引號(hào)不失效單引號(hào) 用來(lái)使shell無(wú)法認(rèn)出所有特殊字符 反引號(hào) 用來(lái)替換命令 反斜杠 用來(lái)使shell無(wú)法認(rèn)出以上的特殊字符 使其后的特殊字符失去特殊含義 如 David Medinets root sky root touchDavid Medinets root sky root lsDavid medinets放在指令前 有取消aliases 別名 的作用 放在特殊符號(hào)前 則該特殊符號(hào)的作用消失 放在指令的最末端 表示指令連接下一行 使得回車(chē)符無(wú)效 只起換行作用 正則表達(dá)式 模式匹配 正則表達(dá)式 正則表達(dá)式在shell 工具程序 Perl語(yǔ)言中有非常重要的地位 正則表達(dá)式通過(guò)一些特殊符號(hào)表示特定的字符串模式 常見(jiàn)的特殊字符包括 字符功能 置于待搜索的字符串之前 匹配行首的字 置于待搜索的字符串之后 匹配行末的字 匹配一個(gè)字的字尾 匹配任意單個(gè)正文字符 str 匹配字符串str中的任意單個(gè)字符 str 匹配不在字符串str中的任意單個(gè)字符 a c 匹配從a到c之間的任一字符 匹配前一個(gè)字符的0次或多次出現(xiàn) 忽略特殊字符的特殊含義 將其看作普通字符 模式匹配 正則表達(dá)式 擴(kuò)充的特殊字符 字符功能 重復(fù)匹配前一項(xiàng)1次以上 重復(fù)匹配前一項(xiàng)0次或1次 j 重復(fù)匹配前一項(xiàng)j次 j 重復(fù)匹配前一項(xiàng)j次以上 k 重復(fù)匹配前一項(xiàng)最多k次 j k 重復(fù)匹配前一項(xiàng)j到k次s t匹配s或t中的一項(xiàng) exp 將表達(dá)式exp作為單項(xiàng)處理 基本元字符集 模式匹配 正則表達(dá)式 匹配行首 行尾 行首 行尾 舉例查找當(dāng)前目錄下面所有子目錄ls l grep d 查找文本文件中 以a開(kāi)頭的行morea txt grep a 查找文本文件中 以a結(jié)尾的行morea txt grep a 查找文本文件中 所有的空行morea txt grep 模式匹配 正則表達(dá)式 匹配單個(gè)字符 模式 舉例 abc 可以匹配12abc34 ababc43等 模式匹配 正則表達(dá)式 匹配0或多個(gè)字符 模式 舉例abc12 可以匹配如下abc123abc14248876abc11abc 模式匹配 正則表達(dá)式 匹配單詞 模式 功能 匹配完整的單詞舉例 模式匹配 正則表達(dá)式 屏蔽特殊字符 功能 將字符串中的特殊字符去掉特殊意義特殊字符 舉例匹配包含 字符的行 匹配包含 的行 匹配包含 的行 模式匹配 正則表達(dá)式 匹配范圍 功能 匹配特定的字符串或字符串集舉例 0123456789 或 0 9 匹配任意數(shù)字 A Za z 匹配任意字母a a zA Z t a開(kāi)始 任意字母 t hH ello 匹配Hello或者h(yuǎn)ello 0 9 匹配任一個(gè)非數(shù)字字符 a zA Z 匹配任一個(gè)非字母字符 模式匹配 正則表達(dá)式 匹配模式結(jié)果出現(xiàn)次數(shù) pattern n 匹配模式出現(xiàn)n次 pattern n 匹配模式出現(xiàn)最少n次 pattern n m 匹配模式出現(xiàn)n到m次之間 n m為0 255中任意整數(shù) 模式匹配 正則表達(dá)式 舉例 A 2 BAABA 4 BAAAAB AAAAAB AAAAAAB A 2 4 BAAB AAAB AAAAB 模式匹配 正則表達(dá)式 練習(xí) 從如下文本中 選出日期格式符合yyyy mm dd的行2006 05 1713910591921chenyq2006071113301131125suwn2006 07 1913123451231aaa2005 11 2513611258734bbb過(guò)濾模式 0 9 4 0 9 2 0 9 2 模式匹配 正則表達(dá)式 變量與表達(dá)式 變量與運(yùn)算符 本地變量環(huán)境變量變量替換位置變量標(biāo)準(zhǔn)變量特殊變量 影響變量的命令引號(hào)運(yùn)算符表達(dá)式替換運(yùn)算符優(yōu)先級(jí) 變量 什么是shell變量本地變量環(huán)境變量變量替換位置變量標(biāo)準(zhǔn)變量特殊變量影響變量的命令 本地變量 本地變量在用戶(hù)現(xiàn)在的shell生命期的腳本中存在使用 variable name value設(shè)置變量及值set顯示本地所有的變量readonlyvariable name變量只讀設(shè)置后不能在設(shè)置回來(lái)了 本地變量 續(xù) root jack root LOCALTEST test root jack root echo LOCALTEST Test root jack root readonlyLOCALTEST root jack root LOCALTEST test1 Bash LOCALTEST readonlyvariable root jack root readonly p 查看當(dāng)前設(shè)置的本地變量Declare rLOCALTEST test Declare irUID 0 示例 環(huán)境變量 用于所有用戶(hù)進(jìn)程 稱(chēng)為子進(jìn)程 登錄進(jìn)程稱(chēng)為父進(jìn)程 Shell中執(zhí)行的用戶(hù)進(jìn)程均稱(chēng)為子進(jìn)程 不像本地變量 只用于當(dāng)前的shell 環(huán)境變量可用于所有子進(jìn)程 包括編輯器 腳本和各種應(yīng)用程序 HOME bash profile etc profile export用于顯示與設(shè)置環(huán)境變量env查看環(huán)境變量eg exportSITECH BeiJing readonlySITECH設(shè)置只讀 環(huán)境變量 如果使用了readonly命令的話(huà) 變量就不可以被修改或清除了 示例如下 exportTEST Test 增加一個(gè)環(huán)境變量TEST readonlyTEST 將環(huán)境變量TEST設(shè)為只讀 unsetTEST 會(huì)發(fā)現(xiàn)此變量不能被刪除 bash unset TEST cannotunset readonlyvariable TEST New 會(huì)發(fā)現(xiàn)此也變量不能被修改 bash TEST readonlyvariable set env export區(qū)別 set顯示當(dāng)前shell的變量 包括當(dāng)前用戶(hù)的變量env顯示當(dāng)前用戶(hù)的變量export顯示當(dāng)前導(dǎo)出成用戶(hù)變量的shell變量每個(gè)shell有自己特有的變量 set 顯示的變量 這個(gè)和用戶(hù)變量是不同的 當(dāng)前用戶(hù)變量和你用什么shell無(wú)關(guān) 不管你用什么shell都在 比如HOME SHELL等這些變量 但shell自己的變量不同 shell是不同的 比如BASH ARGC BASH等 這些變量只有set才會(huì)顯示 是bash特有的 export不加參數(shù)的時(shí)候 顯示哪些變量被導(dǎo)出成了用戶(hù)變量 因?yàn)橐粋€(gè)shell自己的變量可以通過(guò)export 導(dǎo)出 變成一個(gè)用戶(hù)變量 root linux aaa bbb root linux echo aaabbb root linux set grepaaaaaa bbb root linux env grepaaa root linux exportaaa root linux env grepaaaaaa bbb 環(huán)境變量 用C程序來(lái)訪(fǎng)問(wèn)和設(shè)置環(huán)境變量使用下列三個(gè)函數(shù)來(lái)設(shè)置或訪(fǎng)問(wèn)一個(gè)環(huán)境變量 getenv 訪(fǎng)問(wèn)一個(gè)環(huán)境變量 輸入?yún)?shù)是需要訪(fǎng)問(wèn)的變量名字 返回值是一個(gè)字符串 如果所訪(fǎng)問(wèn)的環(huán)境變量不存在 則會(huì)返回NULL setenv 在程序里面設(shè)置某個(gè)環(huán)境變量的函數(shù) unsetenv 清除某個(gè)特定的環(huán)境變量的函數(shù) 有一個(gè)指針變量environ 它指向的是包含所有的環(huán)境變量的一個(gè)列表 下面的程序可以打印出當(dāng)前運(yùn)行環(huán)境里面的所有環(huán)境變量 includeexternchar environ intmain char var for var environ var NULL var printf s n var return0 還可以通過(guò)修改一些相關(guān)的環(huán)境定義文件來(lái)修改環(huán)境變量 比如對(duì)于RedHat等Linux發(fā)行版本 與環(huán)境相關(guān)的文件有 etc profile和 bashrc等 修改完畢后重新登錄一次就生效了 變量替換 續(xù) 1 echo variablename 顯示實(shí)際值到variablename中2 echo variablename value 如果設(shè)置了variablename 則顯示其值value 否則顯示為空 3 echo variablename value 如果未設(shè)置variablename 則顯示用戶(hù)自定義的錯(cuò)誤信息value 4 echo variablename value 如果未設(shè)置variablename 則顯示其值value 否則顯示原來(lái)值 5 echo variablename value 如果未設(shè)置variablename 設(shè)置其值為value 并顯示 變量替換 續(xù) unset 刪除環(huán)境變量unsetvariable name例如 root jack root testvar thisisatest root jack root echo testvar Thisisatest root jack root unsettestvar root jack root echo testvar root jack root 如果是readonly的變量是不能進(jìn)行取消刪除的 位置變量 位置變量表示形式 0 1 2 9向腳本中使用位置參數(shù)向系統(tǒng)命令傳遞參數(shù) 1 2 3 10 11 12 表示腳本傳入的的各個(gè)參數(shù) 注意當(dāng)需表示兩位數(shù)以后的參數(shù)時(shí)數(shù)字要用花括號(hào)括起 標(biāo)準(zhǔn)變量 bash默認(rèn)建立了一些標(biāo)準(zhǔn)環(huán)境變量 可在 etc profile中定義 EXINITHOMEecho HOME IFSLOGNAMEecho LOGNAME獲取當(dāng)前登錄名set grep LOG 與之功能等價(jià)MAILset grep MAIL MAIL usr spool mail account存放郵箱位置MAILCHECK 600每隔600秒掃描郵箱一次MAILMSG YOUHAVENEWMAIL 郵箱信息MAILCHECK 標(biāo)準(zhǔn)變量 MAILPATHPATHeg set grep PATH 取得環(huán)境路徑PS1eg set grep PS 改變命令提示符信息PS2SHELLeg set grep SHELL 取得當(dāng)前SHELL信息TERMINFOeg set grep TERMINFO TERMeg set grep TERM 顯示終端類(lèi)型TZeg set grep TZ 表示時(shí)區(qū)EDITORPWDeg set grep PWD 取得當(dāng)前目錄信息MANPATHeg set grep MANPATH 特殊變量 傳遞到腳本的參數(shù)個(gè)數(shù) 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù) 與位置變量不同 此選項(xiàng)參數(shù)可超過(guò)9個(gè) 腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào) 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程ID 與 相同 但是使用時(shí)加上引號(hào) 并在引號(hào)中返回每個(gè)參數(shù) 顯示shell使用的當(dāng)前選項(xiàng) 與set命令功能相同 顯示最后命令的退出狀態(tài) 0表示沒(méi)有錯(cuò)誤 其它任何值表示有錯(cuò)誤 影響變量的命令 readonly用于顯示或設(shè)置只讀變量 表明選項(xiàng)結(jié)束 f創(chuàng)建只讀變量set設(shè)置或重設(shè)各種shell 影響變量的命令 unset用于取消變量的定義 表明選項(xiàng)結(jié)束 f刪除只讀變量 但不能取消從shell環(huán)境中刪除指定的變量和函數(shù) 如 PATH PS1 PS2 PPID UID EUID等的設(shè)置 運(yùn)算符 運(yùn)算符類(lèi)型 位運(yùn)算符 表示對(duì)方括號(hào)中的表達(dá)式進(jìn)行求值 2 4 例如 bin bash 表示舉例echo 2 8 運(yùn)算符 位運(yùn)算符 運(yùn)算符 運(yùn)算符類(lèi)型邏輯運(yùn)算符賦值運(yùn)算符 eg var 65letvar 4echo var 69 表達(dá)式替換 和 習(xí)慣使用 所有shell的求值都是用整數(shù)完成 可以接受不同基數(shù)的數(shù)字 base n n表示基數(shù)從2到36的任何基數(shù) eg 八進(jìn)制的10加1 結(jié)果為9echo 10 8 1 9 運(yùn)算符優(yōu)先級(jí) 小結(jié) 本地變量環(huán)境變量變量替換位置變量標(biāo)準(zhǔn)變量特殊變量 影響變量的命令引號(hào)運(yùn)算符表達(dá)式替換運(yùn)算符優(yōu)先級(jí) SHELL輸入 輸出 echoreadcat管道tee文件重定向 Shell輸入 輸出控制 echo顯示文本或變量 或者把字符串輸入到文件命令格式echostring e表示解析轉(zhuǎn)義字符 n回車(chē)不換行 linux默認(rèn)回車(chē)換行控制字符 c 不換行 t 跳格 n 換行舉例echo What syour nname c readnameecho LOGNAME echo 示例 echo舉例 bin bash echodecho e Thisecho s3newlines n n n n echo OK echoecho Thisecho s3newlines n n n n echo Thelogfileshaveallbeendone mylogfile txt read從鍵盤(pán)或文件的某一行文本中讀入信息 并將其賦給一個(gè)變量命令格式read變量1變量2 舉例 readname1name2tomjerrybob read 示例 bin bash readnameecho n FirstName readfirstnameecho n LastName readlastnameecho e YourFirstNameis firstname n echo e YourLastNameis lastname n read舉例 文件重定向 標(biāo)準(zhǔn)輸出 輸入及錯(cuò)誤 在shell中執(zhí)行命令時(shí) 每個(gè)進(jìn)程都和三個(gè)打開(kāi)的文件相關(guān)聯(lián) 并使用文件描述符來(lái)引用這些文件 由于文件描述符不容易記憶 shell同時(shí)也給出了相應(yīng)的文件名 文件重定向 改變程序運(yùn)行的輸入來(lái)源和輸出地點(diǎn) 文件重定向 改變程序運(yùn)行的輸入來(lái)源和輸出地點(diǎn) 例1 將myfle1作為sort的輸入 sort myflle1例2 將date的輸出轉(zhuǎn)向到myfile2文件中 date myfile2例3 將Is l的輸出追加到myfile3文件中 Is l myfile3例4 將myprogram錯(cuò)誤輸出改向到err file文件 myprogram2 err file 文件重定向舉例 重定向標(biāo)準(zhǔn)輸出示例catfile sort1 sort out第3種情況catfile sort sort out第1種情況pwd path out第2種情況 nullfile txt創(chuàng)建一個(gè)文件重定向標(biāo)準(zhǔn)輸入示例sortname out第8種情況對(duì)排序后的內(nèi)容輸出到name out文件中 文件重定向舉例 標(biāo)準(zhǔn)輸入示例 第9種情況 root jackshell cat term txtHello thereIamusinga TERM andmyusernameis LOGNAME bye SITECH root jackshell catterm txtHello thereIamusingavt100 andmyusernameisrootbye 文件重定向舉例 重定向標(biāo)準(zhǔn)錯(cuò)誤示例 root jackshell grep trd book txtGrep missiles Nosuchfileordirectory root jackshell grep trd book txt2 dev null解釋 表示把錯(cuò)誤信息扔給 dev null dev null不會(huì)保存錯(cuò)誤信息 實(shí)質(zhì)就是丟失錯(cuò)誤信息 如果sky txt不存在 則錯(cuò)誤信息存入到一個(gè)指定的文件中 如 ls alsky txt2 err message txt 文件重定向舉例 結(jié)合使用標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤示例 root jackshell cataccount new txt Account old txt1 accounts out2 accounts err root jackshell cataccounts out root jackshell cataccounts err 文件重定向舉例 將2個(gè)文件的內(nèi)容重定向到accounts out中 如果某一個(gè)文件不存在 或出錯(cuò) 則將錯(cuò)誤信息重定向到錯(cuò)誤文件中accounts err 合并標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤示例 合并的時(shí)候shell是從左到右分析相應(yīng)命令grep standard standard txt grep out2 1 如果文件不存在 則把錯(cuò)誤信息記錄到grep out中 如果文件存在 也把正確的信息記錄到grep out中 文件重定向舉例 重定向標(biāo)準(zhǔn)輸出ls l ls outls l ls out重定向標(biāo)準(zhǔn)輸入sort dev null組合重定向find name log find log2 1 練習(xí) echoreadcat管道重點(diǎn)掌握tee文件重定向重點(diǎn)掌握 小結(jié) SHELL控制結(jié)構(gòu) 條件測(cè)試 shell的內(nèi)部命令里面有測(cè)試條件的語(yǔ)法test給ifwhile用testcondition或者 condition 條件測(cè)試 文件狀態(tài)測(cè)試邏輯操作符字符串測(cè)試數(shù)值測(cè)試expr 文件狀態(tài)測(cè)試 格式 test狀態(tài)或 狀態(tài) 舉例test wstudent txtecho xstudent txt echo efile 文件存在 d etc 目錄存在 sfile 文件大小大于0 rfile 文件可讀 bfile 區(qū)塊文件 cfile 字符文件 ffile 一般文件 wfile 文件可寫(xiě) xfile 文件可執(zhí)行 kfile 設(shè)定了限定位 gfile 設(shè)定了組位 ufile 設(shè)定了userid pfile 管線(xiàn) ofile 如果當(dāng)前用戶(hù)擁有filename 則為真 字符串測(cè)試 命令格式 操作符字符串 字符串操作符字符串 舉例 z EDITOR EDITOR vi 數(shù)值測(cè)試 命令格式 數(shù)字1 操作符 數(shù)字2 數(shù)字1 操作符 數(shù)字2 舉例 100 lt 110 echo NUMBER 100 NUMBER ge110 echo 900 le 901 a 100 gt 99 echo 邏輯操作符 邏輯操作符 a邏輯與 o邏輯或 邏輯否舉例 xstudent a wstudent echo expr 命令格式expr參數(shù)操作符參數(shù)增量計(jì)數(shù)LOOP 0LOOP expr LOOP 1 數(shù)值測(cè)試模式匹配 條件測(cè)試 小結(jié) 文件狀態(tài)測(cè)試邏輯操作符字符串測(cè)試數(shù)值測(cè)試expr 控制流結(jié)構(gòu) 流控制ifthenelse 條件測(cè)試case 匹配模式 單詞或值循環(huán)for循環(huán)until循環(huán)while循環(huán) ifthenelse語(yǔ)句 語(yǔ)法格式 if條件1then命令1elif條件2then命令2else命令3fi示例 if 10 lt 11 thenecho 10islessthan11 fi ifthenelse語(yǔ)句 bin sh ifsamples2echo n Enteryourname readNAMEif NAME z NAME thenecho sorry youdidnotenteraname elseecho youentered NAME fi 示例 bin sh ifcpifcpmyfile bakmyfile thenecho goodcopy elseecho basename 0 errorcouldnotcopythefiles 2fi ifthenelse語(yǔ)句 bin sh ifelifecho n Enteryourname readNAMEif NAME z NAME thenecho Youdidnotenteraname elif NAME root echo Helloroot elif NAME jack echo Hellojack elseecho youarenotorjack buthi NAME fi 示例 case語(yǔ)句 語(yǔ)法格式 case值in模式1 命令1 模式2 命令2 esac 模式匹配 表示任意字符 表示任意單個(gè)字符 abc a b或c三字符其中之一 a n 從a到n的任一字符 多重選擇 case語(yǔ)句 bin sh casetest1echo n enteranumberbetween1and3pls readNUMcaseNUMin1 echo youentered1 2 echo youentered2 3 echo youentered3 Y y echo youentered NUM echo basename 0 exit1 esac 示例 for循環(huán) 語(yǔ)法格式 for變量名in列表do命令1命令2 done for循環(huán) bin sh fortest1forloopin12345doecho loopdone 示例 bin sh fortest2forloopin isthisyourpen doecho loopdone 列表?yè)Q為 isthisyourpen 或 catmyfile for循環(huán) bin sh fortest3BAK bak forloopin ls doecho backup loopto loop BAK cp loop loop BAKdone 示例 for循環(huán) bin sh fortest4counter 0forfilesin docounter expr counter 1 doneecho Thereare counterfilesin pwd 示例 for循環(huán) 將 foo后綴的文件批量改名為 bar后綴 forfin foo dobase basename f foo mv f base bardone 示例 將大寫(xiě)文件名改為小寫(xiě)文件名 forfin domv f echo f tr A Z a z done until循環(huán) 語(yǔ)法until條件命令1命令2 done示例 bin sh untiltest2counter 0echo counteruntil counter ge 100 docounter expr counter 1 echo counterdone 條件發(fā)生在循環(huán)末尾 至少執(zhí)行一次循環(huán) until循環(huán) 示例 bin sh until monpart backup 得到磁盤(pán)使用的百分比LOOK OUT df grep part awk print 5 sed s g echo LOOK OUTuntil LOOK OUT gt 90 doecho 文件備份已經(jīng)快滿(mǎn)了 mailrootLOOK OUT df grep part awk print 5 sed s g sleep3600done nohup 文件名 sh后臺(tái)運(yùn)行 程序休息3600秒 while循環(huán) 語(yǔ)法格式 while條件do命令1命令2 done while循環(huán) bin sh whiletest1counter 0echo counterwhile counter lt 100 docounter expr counter 1 echo counterdone 示例1 while循環(huán) bin sh whiletest2whilereadLINEdoecho LINEdone a sh 示例2 表示從a sh文件中一行行讀出數(shù)據(jù)到LINE中 循環(huán)輸出 while循環(huán) yymm 200810no 10low 0con db dbaccopr accoprdb152 ACCDBtab name all owedet tmpsrc dcustowesqlplus s con db droptable tab name createtable tab name while no lt100 doif no lt10 thensqlplus s con db insertinto tab name select字段 from src yymm low no commit elif no lt100 theninsertinto tab name selectcontract no id no fee code detail code cust id payed status should payshould favour feefavour payed prepayfrom src yymm no fino expr no 1 doneexit 示例3 while循環(huán) yymm 200810num 10low 0con db dbaccopr accoprdb152 ACCDBtab name all owedet tmpsrc dcustowesqlplus s con db while num lt100 doecho num insertinto tab name selectcontract no id no fee code detail code cust id payed status should payshould favour feefavour payed prepayfrom src yymm num commit num expr num 1 doneexit 示例4 循環(huán)控制 break跳出循環(huán)continue不會(huì)跳出循環(huán) 跳過(guò)本次循環(huán) 進(jìn)入下一次循環(huán) 循環(huán)控制舉例 示例 bin sh breakoutwhile doecho n Enteranynumber 1 5 readANScase ANSin1 2 3 4 5 echo 您鍵入正確的數(shù)字 echo 錯(cuò)誤的輸入 break esacdone 表示永遠(yuǎn)為真 循環(huán)控制舉例 示例 bin sh breakoutwhile doecho n Enteranynumber 1 5 readANScase ANSin1 2 3 4 5 echo 您鍵入正確的數(shù)字 echo 錯(cuò)誤的輸入 是否繼續(xù) y n readIS CONTINUEcase IS CONTINUEiny yes Y YES continue break esacesacdone SHELL實(shí)例 設(shè)計(jì)一個(gè)Shell程序 在 userdata目錄下建立50個(gè)目錄 即user1 user50 并設(shè)置每個(gè)目錄的權(quán)限 其中其他用戶(hù)的權(quán)限為 讀 文件所有者的權(quán)限為 讀 寫(xiě) 執(zhí)行 文件所有者所在組的權(quán)限為 讀 執(zhí)行 考答案 建立程序如下 bin shi 1while i le50 doif d userdata thenmkdir p userdata user ichmod754 userdata user iecho user i let i i 1 或i i 1 elsemkdir userdatamkdir p userdata user ichmod754 userdata user iecho user i let i i 1 或i i 1 fidone 練習(xí) 編寫(xiě)一個(gè)菜單界面1 顯示當(dāng)前目錄下所有文件2 顯示當(dāng)前目錄下所有文件大小3 使用vi編輯器4 查看當(dāng)前系統(tǒng)中登陸的用戶(hù)q 退出菜單 控制流結(jié)構(gòu) 小結(jié) 流控制ifthenelse 條件測(cè)試case 匹配模式 單詞或值循環(huán)for循環(huán)until循環(huán)while循環(huán)循環(huán)控制breakcontinue SHELL函數(shù) shell函數(shù) 函數(shù)定義參數(shù)傳遞函數(shù)文件檢查載入和刪除函數(shù)函數(shù)的返回 函數(shù)定義 情況一 函數(shù)名 命令1命令2 情況二 function函數(shù)名 命令1命令2 函數(shù)定義 bin sh funcfunctionhello echo 你好 今天是 date echo helloecho 示例1 函數(shù)定義 bin shdisksum echo ls l awk d total 5 END print Totalsizeis total disksum 示例2 函數(shù)定義 bin shdisksum echo ls l awk d total 5 END print Totalsizeis total disksum 示例 參數(shù)傳遞 bin sh funcfunctionhelo echo 你好 1今天是 date echo hellojackecho 示例 向函數(shù)傳遞參數(shù)就是在腳本中使用位置變量 1 2 3 9 函數(shù)文件 將常用函數(shù)整理 放在函數(shù)文件中 并載入shell創(chuàng)建函數(shù)文件 bin sh定位文件 函數(shù)名檢查載入函數(shù)set執(zhí)行shell函數(shù)函數(shù)名刪除shell函數(shù)unset函數(shù)名 函數(shù)文件舉例 示例 bin sh func hellofunecho helloecho bin sh hellofunfunctionhelo echo 你好 1今天是 date return1 檢查載入函數(shù)和刪除函數(shù) 查看載入函數(shù)Set刪除函數(shù)unset 檢查載入函數(shù)和刪除函數(shù)舉例 示例 bin sh func hellofunset表示顯示載入狀態(tài)unsethello表示刪除hello函數(shù)調(diào)用echo helloecho bin sh hellofunfunctionhelo echo 你好 1今天是 date return1 函數(shù)的返回 return返回狀態(tài)值不能當(dāng)成變量的返回對(duì)待 使用return返回腳本中函數(shù)調(diào)用的下一語(yǔ)句return 用最后狀態(tài)命令決定返回值return0 無(wú)錯(cuò)誤返回return1 有錯(cuò)誤返回 函數(shù)的返回舉例 示例 bin sh hellofunctionfunctionhelo echo 你好 1今天是 date return0 bin sh func hellofunctionsetecho helloecho echo 取得調(diào)用函數(shù)返回的狀態(tài)值 shell函數(shù) 小結(jié) 函數(shù)定義參數(shù)傳遞函數(shù)文件檢查載入和刪除函數(shù)函數(shù)的返回 目的 將文本的ShellScript文件設(shè)為可執(zhí)行的ShellScript對(duì)任何操作系統(tǒng)而言 文本文件不具備直接執(zhí)行的功能 Dos系統(tǒng)通過(guò)賦予批處理文件 bat 的類(lèi)型 使之執(zhí)行 UNIX系統(tǒng)采用將ShellScript文件權(quán)限設(shè)定成可執(zhí)行 或利用shell的內(nèi)建機(jī)制 使ShellScript文件具備執(zhí)行的功能必要條件 將shellscript文件權(quán)限設(shè)為可執(zhí)行chmodu xfilename只有用戶(hù)自己可執(zhí)行 其它人不能執(zhí)行chmodug xfilename僅用戶(hù)及同組人可執(zhí)行 其它人不能執(zhí)行chmoda xfilename所有人都可以執(zhí)行 shell文本程序的可執(zhí)行化 運(yùn)行 最簡(jiǎn)單的調(diào)試命令當(dāng)然是使用echo命令 您可以使用echo在任何懷疑出錯(cuò)的地方打印任何變量值 這也是絕大多數(shù)的shell程序員要花費(fèi)80 的時(shí)間來(lái)調(diào)試程序的原因 Shell程序的好處在于不需要重新編譯 插入一個(gè)echo命令也不需要多少時(shí)間 shell也有一個(gè)真實(shí)的調(diào)試模式 如果在腳本 strangescript 中有錯(cuò)誤 您可以這樣來(lái)進(jìn)行調(diào)試 這將執(zhí)行該腳本并顯示所有變量的值 shell還有一個(gè)不需要執(zhí)行腳本只是檢查語(yǔ)法的模式 可以這樣使用 這將返回所有語(yǔ)法錯(cuò)誤 調(diào)試腳本 調(diào)試腳本 一般錯(cuò)誤 循環(huán)錯(cuò)誤for while until和case語(yǔ)句中的錯(cuò)誤是指實(shí)際語(yǔ)句段不正確 也許漏寫(xiě)了固定結(jié)構(gòu)中的一個(gè)保留字 下面錯(cuò)誤打印信息done 這是一個(gè)很好的線(xiàn)索 因?yàn)檫@時(shí)知道正在處理一個(gè)while語(yǔ)句 回溯腳本段 檢查while語(yǔ)句 是否漏寫(xiě)或錯(cuò)寫(xiě)了關(guān)鍵字 如d或者正在使用的條件語(yǔ)句 調(diào)試腳本 一般錯(cuò)誤 典型的漏寫(xiě)引號(hào)第二個(gè)典型錯(cuò)誤是漏寫(xiě)引號(hào)錯(cuò)誤 經(jīng)常要注意這個(gè)問(wèn)題 因?yàn)榇隋e(cuò)誤經(jīng)常出現(xiàn) 這里給出解決這類(lèi)錯(cuò)誤的唯一方案是在腳本中確保所有引號(hào)成對(duì)出現(xiàn) 當(dāng)shell打印出錯(cuò)誤行后 通常在vi編輯器中查看文件 使用vi的setnu選項(xiàng)調(diào)試錯(cuò)誤 先進(jìn)入vi 然后點(diǎn)擊鍵 后跟一冒號(hào) 再鍵入setnu 這時(shí)給出文本行號(hào) 然后進(jìn)入shell打印錯(cuò)誤行 調(diào)試腳本 一般錯(cuò)誤 測(cè)試錯(cuò)誤另一個(gè)常見(jiàn)錯(cuò)誤是在使用 eq語(yǔ)句時(shí)忘記在測(cè)試條件一邊使用數(shù)字取值 如果得到下列錯(cuò)誤提示 通常是由于兩件事情 需要在變量和方括號(hào)間加空格 在方括號(hào)里漏寫(xiě)操作符 missing 調(diào)試腳本 一般錯(cuò)誤 字符大小寫(xiě)經(jīng)驗(yàn)上講大多數(shù)錯(cuò)誤是由于使用變量時(shí)大小寫(xiě)保持不一致 例如經(jīng)常在開(kāi)始定義時(shí)用大寫(xiě) 然后在變量調(diào)用時(shí)用了小寫(xiě)字符 這樣難免變量會(huì)沒(méi)有賦值 調(diào)試腳本 一般錯(cuò)誤 for循環(huán)使用for循環(huán)時(shí) 有時(shí)會(huì)忘了在循環(huán)的列表部分用 符號(hào) 特別是在讀取字符串時(shí) 調(diào)試腳本 一般錯(cuò)誤 echo最有用的調(diào)試腳本工具是echo命令 一般在可能出現(xiàn)問(wèn)題的腳本重要部分加入echo命令 例如在變量讀取或修改操作其前后加入echo命令 使用最后狀態(tài)命令判斷命令是否成功 這里需要注意的是 不要使用echo命令后直接加最后狀態(tài)命令 因?yàn)榇嗣钣肋h(yuǎn)為真 set命令 set命令可輔助腳本調(diào)試 以下是set命令常用的調(diào)試選項(xiàng) set n讀命令但并不執(zhí)行 set v顯示讀取的所有行 set x顯示所有命令及其參數(shù) 將set選項(xiàng)關(guān)閉 只需用 替代 有人總認(rèn)為 應(yīng)該為開(kāi) 而 應(yīng)為關(guān)閉 但實(shí)際剛好相反 可以在腳本開(kāi)始時(shí)將set選項(xiàng)打開(kāi) 然后在結(jié)束時(shí)關(guān)閉它 或在認(rèn)為有問(wèn)題的特殊語(yǔ)句段前后打開(kāi)及關(guān)閉它 調(diào)試示例演示 以下腳本將名字保存在變量列表中 用戶(hù)輸入名字 for循環(huán)循環(huán)變量列表查看是否有匹配模式 注意這里在腳本開(kāi)始時(shí)使用了set x 并在結(jié)尾部分關(guān)閉它 調(diào)試示例演示 運(yùn)行此腳本 給出一個(gè)不在列表中的名字 輸出如下 輸出顯示對(duì)變量列表進(jìn)行循環(huán)時(shí)所有的比較操作 當(dāng)讀取文件或進(jìn)行字符串或取值的比較發(fā)現(xiàn)問(wèn)題時(shí) 使用set命令是很有必要的 總結(jié) 跟蹤錯(cuò)誤的最好方式是親自查閱腳本 并使用et命令并加大量的echo語(yǔ)句 高級(jí)編程技巧 快速創(chuàng)建一個(gè)文件自動(dòng)ftp傳輸訪(fǎng)問(wèn)數(shù)據(jù)庫(kù) 快速創(chuàng)建一個(gè)文件 快速創(chuàng)建一個(gè)文件 并向其中存入一些文本 cat myfile myfile NEWFILE 自動(dòng)ftp傳輸 問(wèn)題 服務(wù)器資源下載演示 下面的腳本將會(huì)提示如下的信息 1 希望登錄的遠(yuǎn)程主機(jī) 2 文件傳輸?shù)念?lèi)型是二進(jìn)制方式還是ASCII方式 3 要下載的文件名 4 存放下載文件的本地目錄 實(shí)現(xiàn)腳本如下 訪(fǎng)問(wèn)數(shù)據(jù)庫(kù) shell腳本一個(gè)常用的用途就是訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)系統(tǒng)獲得信息 實(shí)現(xiàn)這樣的功能 是再理想不過(guò)了 可以用它來(lái)輸入你在面對(duì)數(shù)據(jù)庫(kù)提示時(shí)所做的各種選擇 下面的例子介紹如何使用 來(lái)連接其他應(yīng)用程序 完成相應(yīng)的任務(wù) SHELL腳本案例分析 示例一 示例 項(xiàng)目實(shí)例 項(xiàng)目案例一 財(cái)務(wù)賬務(wù)項(xiàng)目程序片段分析 項(xiàng)目案例二 電信特服與月租費(fèi)用程序片段分析 小結(jié) 作為一個(gè)系統(tǒng)管理員必須了解和掌握shell的技術(shù) 包括 shell基本概念和功能shell變量shell命令shell語(yǔ)言控制結(jié)構(gòu)shell的編程技術(shù) UNIX系統(tǒng)的管理配置文件都是利用shell語(yǔ)言編寫(xiě)的 通過(guò)shell程序?qū)崿F(xiàn)對(duì)系統(tǒng)的集成 維護(hù) 控制 優(yōu)化和管理 shell技術(shù)在UNIX系統(tǒng)中發(fā)揮著巨大的作用- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- UnixShell 編程 基礎(chǔ) 培訓(xùn)
鏈接地址:http://m.appdesigncorp.com/p-6436254.html