版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
項目9學(xué)習(xí)Shell腳本任務(wù)1BashShell基礎(chǔ)認識BashShell12Bash變量3通配符和特殊符號4重定向操作5Bash命令流6命令別名和歷史記錄1認識BashShell1認識BashShellShell位于操作系統(tǒng)內(nèi)核外層,為用戶提供一個與內(nèi)核交互的操作環(huán)境通過Shell完成工作往往效率更高Shell兼容性較好,在不同的Linux發(fā)行版中使用方式相同自動化運維是學(xué)習(xí)Shell的重要原因什么是Shellwhere
there’sashell,there’saway1認識BashShellBourneShell:UNIX操作系統(tǒng)最初使用的ShellBash:Linux的默認Shell,是BourneShell的擴展和超集csh(CShell):BSDUNIX的默認Shell,已被tcsh取代ksh(KornShell):編程和交互功能優(yōu)秀,許多系統(tǒng)安裝腳本都使用ksh編寫ZShell:Linux系統(tǒng)里最龐大的一種Shell,使用復(fù)雜,一般不使用常見的Shell1認識BashShell歷史命令:保存執(zhí)行過的命令,可以快速重復(fù)執(zhí)行命令別名:將長命令簡化為短命令,或用習(xí)慣用法代替命令和文件路徑補全:通過Tab鍵快速輸入命令名或路徑名通配符:快速查找和處理文件管道和重定向:最常使用的操作之一Bash的主要功能和特性2Bash變量2Bash變量變量:用一個固定的字符串代表可能發(fā)生變化的內(nèi)容包含變量名和變量值兩個要素變量可以簡化Shell腳本的編寫,使Shell腳本更簡潔也更易維護變量為進程間共享數(shù)據(jù)提供了一種新的手段Bash變量fname=/home/zys/tmp/file1變量名變量值兩種形式:$var_name或${var_name}使用echo命令輸出變量值讀取變量值[zys@centos8~]$echo$SHELL //第1種方法,SHELL是一個環(huán)境變量/bin/bash <==這是SHELL變量的值[zys@centos8~]$echo${SHELL} //第2種方法/bin/bash[zys@centos8~]$echo${shell} //shell變量未定義
<==變量值為空[zys@centos8~]$兩種方式有區(qū)別2Bash變量使用變量之前必須先定義一個變量并設(shè)置變量的值用“=”連接變量名和變量值:var_name=var_value設(shè)置變量值[zys@centos8~]$fname=/etc/os-release //定義fname變量并為其賦值[zys@centos8~]$echo$fname/etc/os-release[zys@centos8~]$fname=/etc/centos-release //修改fname變量的值[zys@centos8~]$echo$fname/etc/centos-release2Bash變量變量名由字母、數(shù)字和下劃線組成,但首字符不能是數(shù)字設(shè)置變量值是,“=”左右不能直接連接空格變量值中有空格,可以使用雙引號或單引號把變量值括起來設(shè)置變量的規(guī)則[zys@centos8~]$echo$SHELL/bin/bash[zys@centos8~]$myshell1="myshellis$SHELL"[zys@centos8~]$echo$myshell1myshellis/bin/bash <==代入SHELL變量的值[zys@centos8~]$myshell2='myshellis$SHELL'[zys@centos8~]$echo$myshell2myshellis$SHELL <==把“$SHELL”本身作為變量值單雙引號意義不同2Bash變量用命令的執(zhí)行結(jié)果為變量賦值:`command`或$(command)通過read命令將用戶的鍵盤輸入賦值給變量:readvar_name設(shè)置變量的規(guī)則(續(xù))[zys@centos8~]$curdate=`date` //使用反單引號獲取命令執(zhí)行結(jié)果[zys@centos8~]$echo$curdate2024年02月28日星期三19:24:08CST[zys@centos8~]$curdate=$(date) //使用小括號獲取命令執(zhí)行結(jié)果[zys@centos8~]$echo$curdate2024年02月28日星期三19:24:19CST[zys@centos8~]$readfname //從鍵盤上獲取變量fname的值/etc/os-release <==在鍵盤上輸入這一行然后按Enter鍵[zys@centos8~]$echo$fname/etc/os-release2Bash變量使用declare命令修改變量的數(shù)據(jù)類型declare命令僅支持整數(shù)的數(shù)值運算設(shè)置變量的規(guī)則(續(xù))[zys@centos8~]$declare-ivar=3*7 //將變量var聲明為整數(shù)[zys@centos8~]$echo$var21[zys@centos8~]$var=8/5 //取整[zys@centos8~]$echo$var1[zys@centos8~]$var=2.3 //賦值為浮點數(shù)bash:2.3:語法錯誤:無效的算術(shù)運算符(錯誤符號是".3")2Bash變量使用unset取消或刪除變量,在unset命令后跟變量名即可刪除變量[zys@centos8~]$echo$myshellmyshellis/bin/bash[zys@centos8~]$unsetmyshell //刪除變量[zys@centos8~]$echo$myshell <==變量已刪除,值為空[zys@centos8~]$2Bash變量操作系統(tǒng)內(nèi)置的變量在登錄操作系統(tǒng)后就默認存在,多用于保存重要的系統(tǒng)參數(shù)環(huán)境變量可以被系統(tǒng)中所有的應(yīng)用共享使用env和export命令查看系統(tǒng)當前的環(huán)境變量環(huán)境變量[zys@centos8~]$env //也可以使用export命令查看HOSTNAME=centos8SHELL=/bin/bashUSER=zysPATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/zys/binLANG=zh_CN.UTF-8HOME=/home/zys2Bash變量幾個特殊的變量[zys@centos8~]$echo$$ //查看當前Bash進程的PID4985[zys@centos8~]$echo$?0 <==上一個命令(即echo$$)執(zhí)行成功[zys@centos8~]$ls/etc/centos-release2ls:無法訪問'/etc/centos-release2':沒有那個文件或目錄[zys@centos8~]$echo$?2 <==上一個命令(即lsfile11)執(zhí)行異常[zys@centos8~]$echo$?0 <==上一個命令(即echo$?)執(zhí)行成功
$$:查看當前Bash進程的PID
$?:返回上一個命令的執(zhí)行結(jié)果,0表示成功,非0表示失敗或異常2Bash變量變量的作用范圍[zys@centos8~]$p_var="variableinparentprocess" //在父進程定義的變量[zys@centos8~]$bash //使用bash命令創(chuàng)建子進程[zys@centos8~]$echo$p_var //這里已經(jīng)處于子進程的工作界面
<==子進程中沒有p_var變量,所以輸出為空[zys@centos8~]$exit //退出子進程exit[zys@centos8~]$ //返回父進程的工作界面一個Bash窗口對應(yīng)一個Bash進程,執(zhí)行的命令也都是(子)進程子進程運行時,父進程一般處于“睡眠”狀態(tài)子進程執(zhí)行完畢,父進程重新開始運行默認情況下子進程不會繼承父進程定義的變量2Bash變量變量的作用范圍(續(xù))[zys@centos8~]$p_var="variableinparentprocess"[zys@centos8~]$exportp_var //允許子進程使用該變量[zys@centos8~]$bash[zys@centos8~]$echo$p_varvariableinparentprocess <==子進程繼承了該變量[zys@centos8~]$exit使用export命令使子進程繼承父進程的變量export命令是單向的,即父進程把變量傳遞給子進程后,如果在子進程中修改了變量值,那么修改后的變量值無法傳遞給父進程在新打開的Bash窗口中無法共享變量2Bash變量3通配符和特殊符號通配符用特定的符號對文件名進行模式匹配(patternmatching)用特定的符號表示文件名的某種模式遇到這些特定的符號,就用相應(yīng)的模式對文件名進行擴展3通配符和特殊符號通配符-示例3通配符和特殊符號[zys@centos8tmp]$touchf1f2F1F2file1[zys@centos8tmp]$ls* //匹配任意文件f1F1f2F2file1[zys@centos8tmp]$lsf? //匹配以f開頭,后跟一個字符的文件f1f2[zys@centos8tmp]$lsf* //匹配以f開頭的所有文件f1f2file1[zys@centos8tmp]$ls[^f]* //匹配不以f開頭的所有文件F1F2[zys@centos8tmp]$ls[fF]? //匹配以f或F開頭,后跟一個字符的文件f1F1f2F2[zys@centos8tmp]$lsf[0-9] //匹配以f開頭,后跟一個數(shù)字的文件f1f2特殊符號盡量避免使用特殊符號為文件命名3通配符和特殊符號4重定向操作重定向基本概念默認情況下,標準輸入是鍵盤,標準輸出是屏幕(即顯示器)Linux命令從鍵盤獲得輸入,并把執(zhí)行結(jié)果在屏幕中顯示出來重定向:重新指定命令的輸入和輸出有輸入重定向和輸出重定向之分4重定向操作輸出重定向-覆蓋原文件[zys@centos8tmp]$pwd/home/zys/tmp <==執(zhí)行結(jié)果默認顯示在屏幕中[zys@centos8tmp]$pwd>pwd.result //將執(zhí)行結(jié)果輸出到文件pwd.result中[zys@centos8tmp]$catpwd.result
/home/zys/tmp在命令之后輸入大于號“>”并且后跟一個文件名對原文件的內(nèi)容進行了“覆蓋”,即清空原文件內(nèi)容4重定向操作輸出重定向-追加新內(nèi)容[zys@centos8tmp]$catpwd.result
/home/zys/tmp <==當前內(nèi)容[zys@centos8tmp]$ls-lF*
-rw-r--r--.1zysdevteam02月2921:11F1-rw-r--r--.1zysdevteam02月2921:11F2[zys@centos8tmp]$ls-lF*>>pwd.result //將ls命令的結(jié)果追加到文件pwd.result中[zys@centos8tmp]$catpwd.result
/home/zys/tmp-rw-r--r--.1zysdevteam02月2921:11F1-rw-r--r--.1zysdevteam02月2921:11F2使用兩個大于號“>>”實現(xiàn)“追加”的效果在原文件的基礎(chǔ)上“追加”新內(nèi)容4重定向操作輸入重定向[zys@centos8tmp]$vimf1 //添加下面兩行內(nèi)容23+34 12*3[zys@centos8tmp]$bc<f2 //輸入重定向:從文件f1中獲得輸入內(nèi)容5736[zys@centos8tmp]$bc<f1>f2 //同時進行輸入重定向和輸出重定向[zys@centos8tmp]$catf25736將原來從鍵盤輸入的數(shù)據(jù)改為從文件讀取可以同時使用輸入輸出重定向4重定向操作5Bash命令流連續(xù)執(zhí)行命令-命令間沒有依賴關(guān)系[zys@centos8tmp]$clear;ls //依次執(zhí)行clear和ls兩條命令f1F1f2F2file1file2pwd.result命令間用分號“;”分隔,只要按一次Enter鍵,這些命令就會被依次執(zhí)行適合于命令之間沒有依賴關(guān)系的情況不管前一條命令成功或失敗,后一條命令都會執(zhí)行5Bash命令流連續(xù)執(zhí)行命令-命令間有依賴關(guān)系[zys@centos8~]$cdbin&&touchfile1 //如果cd命令執(zhí)行成功就接著執(zhí)行touch命令-bash:cd:bin:沒有那個文件或目錄 <==cd命令執(zhí)行失敗[zys@centos8~]$cdbin||mkdirbin //如果cd命令執(zhí)行失敗就接著執(zhí)行mkdir命令-bash:cd:bin:沒有那個文件或目錄 [zys@centos8~]$ls-ldbindrwxr-xr-x.2zysdevteam62月2921:31bin <==目錄bin已創(chuàng)建命令間用“&&”或“||”連接用“$?”查看前一條命令執(zhí)行結(jié)果5Bash命令流管道命令[zys@centos8~]$cat/etc/os-release|wc //wc命令把cat命令的輸出作為輸入
1317333[zys@centos8~]$cat/etc/os-release|wc|wc //連續(xù)使用兩次管道命令
1324功能:一個命令的輸出成為另一個命令的輸入使用管道符號“|”連接兩個命令,左側(cè)命令的輸出成為右側(cè)命令的輸入可以在一條命令中多次使用管道符號以實現(xiàn)更復(fù)雜的操作5Bash命令流命令別名功能:簡化復(fù)雜的命令,或者以自己習(xí)慣的方式使用命令如果沒有alias關(guān)鍵字,別名的設(shè)置和Bash變量幾乎是相同的單獨使用alias命令可以查看Bash當前已設(shè)置的別名使用別名還可以替換系統(tǒng)已有的命令在命令行中設(shè)置的命令別名只對當前Bash進程有效如果想刪除已設(shè)置的命令別名,可以使用unalias命令5Bash命令流alias命令別名=’命令[選項][參數(shù)]’命令歷史記錄功能:保存命令行窗口中執(zhí)行過的命令以便后續(xù)查找或執(zhí)行命名保存在歷史命令文件中,并且為每條命令分配唯一的編號使用history命令處理和歷史命令相關(guān)的操作HISTSIZE變量指定history命令最多可以顯示的命令條數(shù),默認值是1000歷史命令文件一般是~/.bash_history,由HISTFILE變量指定HISTFILESIZE變量指定歷史命令文件最多可以保存的命令總數(shù),默認值是10005Bash命令流命令歷史記錄(續(xù))重復(fù)執(zhí)行上一條命令在命令行中輸入“!!”或“!-1”可以快速執(zhí)行上一條命令“!-n”表示執(zhí)行最近的第n條命令按【Ctrl+P】或鍵盤的向上方向鍵調(diào)出最近一條命令,按回車鍵執(zhí)行通過命令編號執(zhí)行歷史命令使用“!n”可以快速執(zhí)行編號為n的歷史命令通過命令關(guān)鍵字執(zhí)行歷史命令使用“!cmd”可以查找最近一條以cmd開頭的命令并執(zhí)行通過【Ctrl+R】組合鍵搜索歷史命令使用【Ctrl+R】組合鍵對歷史命令進行搜索,按回車鍵即可執(zhí)行5Bash命令流任務(wù)2正則表達式正則表達式概述12基礎(chǔ)正則表達式1正則表達式概述1正則表達式概述管理員經(jīng)常需要提取特定信息,或者對文件的內(nèi)容進行查找、替換或刪除操作正則表達式提高了系統(tǒng)管理員的工作效率和準確性正則表達式使用一系列符號對字符串進行模式匹配支持正則表達式的工具有很多,如grep、vim、sed、awk等驗證數(shù)據(jù)的有效性替換文本內(nèi)容從字符串中提取子字符串什么是正則表達式2基礎(chǔ)正則表達式2基礎(chǔ)正則表達式基礎(chǔ)正則表達式-示例文件[zys@centos8tmp]$cat-nreg_file //正則表達式示例文件
1 Repeatthedoseafter12hoursifnecessary2 Shedozedoffinfrontofthefirewithher"cat"3 4 HehesitatedforthemerestfrActionofasecond,5 andhesaid:"ohhhhhhhhho,ithurtsme"直接查找特定的字符串如果字符串包含空格,可以將其包含在單引號或雙引號中如果字符串中包含特殊字符,可以使用轉(zhuǎn)義符“\”基礎(chǔ)正則表達式-匹配普通字符串[zys@centos8tmp]$grep-ndosereg_file //匹配普通字符串1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n'forthe'reg_file //使用引號包含空格4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n\"cat\"reg_file //使用轉(zhuǎn)義符2:Shedozedoffinfrontofthefirewithher"cat"2基礎(chǔ)正則表達式在“[]”中包含一個或多個大寫字母、小寫字母或數(shù)字的任意組合正則表達式只會匹配其中的一個字符(英文字母和數(shù)字都是字符)基礎(chǔ)正則表達式-匹配字符集合[zys@centos8tmp]$grep-n'do[sz]e'reg_file //匹配字符集合1:Repeatthedoseafter12hoursifnecessary2:Shedozedoffinfrontofthefirewithher"cat"[zys@centos8tmp]$grep-n'fr[oA][nc]t'reg_file //連續(xù)匹配字符集合2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基礎(chǔ)正則表達式在“[]”中使用“-”表示某一范圍的數(shù)字和字母“[a-z]”表示從a到z的任意一個小寫字母“[A-Z]”表示從A到Z的任意一個大寫字母“[0-9]”表示從0到9的任意一個數(shù)字基礎(chǔ)正則表達式-匹配字符范圍[zys@centos8tmp]$grep-n'fr[a-zA-Z][a-z]t'reg_file //連續(xù)匹配字符范圍2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基礎(chǔ)正則表達式“[-]”的有效性依賴于系統(tǒng)的語言設(shè)置可以使用特殊符號表示特定范圍的字符基礎(chǔ)正則表達式-特殊符號[zys@centos8tmp]$grep-n'[[:digit:]]'reg_file1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n'[[:punct:]]'reg_file2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,5:andhesaid:"ohhhhhhhhho,ithurtsme"2基礎(chǔ)正則表達式“[^]”表示對“[]”中的內(nèi)容進行反向匹配不包括“[]”中的任意一個字符基礎(chǔ)正則表達式-反向字符匹配[zys@centos8tmp]$grep-n'[^hH]er'reg_file //字符反向匹配:er前沒有h和H1:Repeatthedoseafter12hoursifnecessary4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n'[^a-zA-Z]f'reg_file //結(jié)合使用反向匹配和字符范圍2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n'[^[:blank:]]he'reg_file//結(jié)合使用反向匹配和特殊符號1:Repeatthedoseafter12hoursifnecessary2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基礎(chǔ)正則表達式“^str”和“str$”分別表示以字符串str開頭和結(jié)尾的行基礎(chǔ)正則表達式-匹配行首和行尾[zys@centos8tmp]$grep-n'^She'reg_file
2:Shedozedoffinfrontofthefirewithher"cat"[zys@centos8tmp]$grep-n'^[RH]'reg_file
1:Repeatthedoseafter12hoursifnecessary4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n'^[[:lower:]]'reg_file5:andhesaid:"ohhhhhhhhho,ithurtsme"[zys@centos8tmp]$grep-n'ary$'reg_file
1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n'^$'reg_file3:[^]和^[]不同2基礎(chǔ)正則表達式“.”表示匹配任意一個字符一個“.”只能匹配一個字符基礎(chǔ)正則表達式-匹配任意字符[zys@centos8tmp]$grep-n'o.d'reg_file //o和d之間只有一個字符4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n'o..d'file1 //o和d之間有兩個字符2:Shedozedoffinfrontofthefirewithher"cat"2基礎(chǔ)正則表達式“*”表示其前面的字符可以重復(fù)出現(xiàn)0次、一次或多次基礎(chǔ)正則表達式-匹配重復(fù)字符[zys@centos8tmp]$grep-n'o[a-z]*d'reg_file //o和d之間有任意多字符2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n's*'reg_file //s出現(xiàn)0或多次1:Repeatthedoseafter12hoursifnecessary2:Shedozedoffinfrontofthefirewithher"cat"3:4:HehesitatedforthemerestfrActionofasecond,5:andhesaid:"ohhhhhhhhho,ithurtsme"2基礎(chǔ)正則表達式“\{m,n\}”表示字符可以出現(xiàn)m~n次基礎(chǔ)正則表達式-匹配精確字符數(shù)[zys@centos8tmp]$grep-n'oh\{5,9\}o'reg_file//o之后的h出現(xiàn)5~9次5:andhesaid:"ohhhhhhhhho,ithurtsme"[zys@centos8tmp]$grep-n's\{2\}'reg_file //s出現(xiàn)2次1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n's\{1,\}'reg_file //s至少出現(xiàn)1次1:Repeatthedoseafter12hoursifnecessary4:HehesitatedforthemerestfrActionofasecond,5:andhesaid:"ohhhhhhhhho,ithurtsme"[zys@centos8tmp]$grep-n'off\{,1\}'reg_file //of之后的f至多出現(xiàn)1次2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基礎(chǔ)正則表達式基礎(chǔ)正則表達式-總結(jié)2基礎(chǔ)正則表達式任務(wù)3Shell腳本認識Shell腳本12腳本執(zhí)行與返回值3運算符與條件測試4分支結(jié)構(gòu)5循環(huán)結(jié)構(gòu)6Shell函數(shù)1認識Shell腳本Shell腳本是一組Linux命令的集合把腳本文件提交給Bash解釋執(zhí)行支持以編程的方式編寫命令支持自動化運維Shell腳本基本概念[zys@centos8~]$cdshell[zys@centos8shell]$vimmyscript.sh#!/bin/bash#Thisismyfirstshellscriptecho"Helloworld..."1認識Shell腳本2腳本執(zhí)行與返回值設(shè)置腳本文件的可執(zhí)行權(quán)限指定腳本文件的絕對路徑或相對路徑直接執(zhí)行腳本執(zhí)行方式-為腳本文件添加執(zhí)行權(quán)限[zys@centos8shell]$chmoda+xmyscript.sh //為腳本文件添加執(zhí)行權(quán)限[zys@centos8shell]$ls-lmyscript.sh-rwxr-xr-x.1zysdevteam672月2922:39myscript.sh[zys@centos8shell]$./myscript.sh //輸入腳本文件名直接執(zhí)行Helloworld...2腳本執(zhí)行與返回值使用sh或bash命令執(zhí)行腳本文件,把文件名作為參數(shù)sh其實是bash的鏈接文件不管腳本文件有沒有可執(zhí)行權(quán)限,都可以采用這種方式執(zhí)行腳本執(zhí)行方式-使用sh命令[zys@centos8shell]$whichsh/usr/bin/sh[zys@centos8shell]$ls-l/usr/bin/shlrwxrwxrwx.1rootroot41月122021/usr/bin/sh->bash[zys@centos8shell]$shmyscript.sh //相當于bashmyscript.shHelloworld...2腳本執(zhí)行與返回值使用source命令或點運算符“.”執(zhí)行腳本文件,后跟腳本文件名腳本執(zhí)行方式-source[zys@centos8shell]$sourcemyscript.sh //相當于.myscript.shHelloworld...2腳本執(zhí)行與返回值前兩種方式,腳本文件在當前Bash進程的子進程中執(zhí)行,在腳本文件中無法使用父進程創(chuàng)建的變量第3種方式則是直接在當前Bash進程中執(zhí)行腳本執(zhí)行方式-區(qū)別[zys@centos8shell]$vimmyscript.sh
#!/bin/bashecho"Helloworld..."echo"currentpidis$$" #在腳本中查詢進程PIDecho"valueofp_varis'$p_var'" #在腳本中使用變量p_var[zys@centos8shell]$p_var="variableinparentprocess"
[zys@centos8shell]$echo$$4278 <==父進程PID[zys@centos8shell]$shmyscript.sh //第2種執(zhí)行方式Helloworld...currentpidis4428 <==子進程PIDvalueofp_varis'' <==變量值為空[zys@centos8shell]$sourcemyscript.sh //第3種執(zhí)行方式Helloworld...currentpidis4278 <==父進程PIDvalueofp_varis'variableinparentprocess'2腳本執(zhí)行與返回值Shell腳本的執(zhí)行順序是從上至下、從左至右出現(xiàn)在“#”之后的內(nèi)容為注釋,除非“#”是字符串的一部分第1行一般是以“#!”開頭,說明腳本文件的屬性對于空行、空格或制表符(Tab)直接忽略把回車符當作一條命令的結(jié)束符,讀到回車符就開始執(zhí)行命令在行末輸入轉(zhuǎn)義符“\”換行繼續(xù)輸入命令腳本執(zhí)行順序2腳本執(zhí)行與返回值腳執(zhí)行結(jié)束,都會返回一個整數(shù)類型的狀態(tài)碼一般用0表示執(zhí)行成功,用非0值表示異常結(jié)束可以使用“$?”特殊變量查看狀態(tài)碼還可以使用exit命令指定返回值,形式為exitn,取值范圍是0~255腳本狀態(tài)碼[zys@centos8shell]$vimmyscript.sh#!/bin/bashecho"Helloworld..."exit0 #在腳本中指定退出狀態(tài)碼為0[zys@centos8shell]$shmyscript.shHelloworld...[zys@centos8shell]$echo$?02腳本執(zhí)行與返回值可以向腳本文件傳遞參數(shù)常用的表示方法:$n$#$*$@腳本參數(shù)[zys@centos8shell]$vimmyscript.sh
#!/bin/bashecho"Helloworld..."echo"I'mfrom$1,$2"echo"Totalof$#parameters:$@"[zys@centos8shell]$shmyscript.shJiangsuChina //輸入兩個參數(shù)Helloworld...I'mfromJiangsu,ChinaTotalof2parameters:JiangsuChina2腳本執(zhí)行與返回值3運算符與條件測試采用“$((exp))”的形式,內(nèi)層的小括號中是算術(shù)表達式“$(())”只支持整數(shù)的算術(shù)運算表達式中的變量可以不使用“$”前導(dǎo)符號算術(shù)運算[zys@centos8shell]$vimmyscript.sh
#!/bin/basha=5;b=6echo$((5+6))echo$(($a+$b))[zys@centos8shell]$shmyscript.sh
11113運算符與條件測試采用“$((exp
))”進行整數(shù)間的算術(shù)比較運算運算符包括“<”“>”“<=”“>=”“==”“!=”如果比較結(jié)果為真,表達式返回1,否則返回0算術(shù)運算(續(xù))[zys@centos8shell]$vimmyscript.sh#!/bin/basha=5;b=6echo$((a>b))echo$((a!=b))[zys@centos8shell]$shmyscript.sh
013運算符與條件測試采用“$((exp
))”進行整數(shù)間的算術(shù)比較運算運算符包括“<”“>”“<=”“>=”“==”“!=”如果比較結(jié)果為真,表達式返回1,否則返回0算術(shù)運算(續(xù))[zys@centos8shell]$vimmyscript.sh
#!/bin/basha=5;b=6echo$((a>b?a:b)) #條件運算符echo$((a++)) #自增運算符echo$((++a)) #自增運算符[zys@centos8shell]$shmyscript.sh
6573運算符與條件測試主要用于判斷一個表達式的真假,亦即表達式是否成立使用“$?”特殊變量獲取test命令的返回值如果表達式為真,test命令返回0值,否則返回一個非0值test條件測試[zys@centos8shell]$vimmyscript.sh
#!/bin/bashtest-emyscript.sh&&echo"exist"||echo"notexist"test-emyscript2.sh&&echo"exist"||echo"notexist"[zys@centos8shell]$shmyscript.shexistnotexist3運算符與條件測試test條件測試-關(guān)系運算#!/bin/basha=11;b=16test$a-eq$b&&echo"$a=$b"||echo"$a!=$b"test$a-gt$b&&echo"$a>$b"||echo"$a<=$b"test$a-ge$b&&echo"$a>=$b"||echo"$a<$b"[zys@centos8shell]$shmyscript.sh11!=1611<=1611<163運算符與條件測試test條件測試-字符串運算[zys@centos8shell]$vimmyscript.sh
#!/bin/basha="centos"b=""test-z"$a"&&echo"'$a'isnull"||echo"'$a'isnotnull"test-n"$b"&&echo"'$b'isnotnull"||echo"'$b'isnull"test"$a"=="centos"&&echo"'$a'='centos'"||echo"'$a'!='centos'"[zys@centos8shell]$shmyscript.sh'centos'isnotnull''isnull'centos'='centos'3運算符與條件測試test條件測試-文件類型測試3運算符與條件測試test條件測試-文件權(quán)限和比較測試3運算符與條件測試test條件測試-文件測試示例[zys@centos8shell]$touchfile1;ls-l-rw-rw-r--.1zyszys02月2920:40file1-rwxrwxr-x.1zyszys922月2920:38myscript.sh[zys@centos8shell]$vimmyscript.sh
#!/bin/bashf1="myscript.sh"f2="file2"test-f"$f1"&&echo"$f1:ordinaryfile"||echo"$f1:notordinaryfile"test-r"$f1"&&echo"$f1:readable"||echo"$f1:notreadable"test"$f1"-nt"$f2"&&echo"$f1isnewerthan$f2"||echo"$f2isnewerthan$f1"[zys@centos8shell]$shmyscript.shmyscript.sh:ordinaryfilemyscript.sh:readablemyscript.shisnewerthanfile23運算符與條件測試test條件測試-布爾運算[zys@centos8shell]$vimmyscript.sh
#!/bin/basha=11;b=16f1="myscript.sh"f2="file2"test$a-gt$b-o$a-eq$b&&echo"$a>=$b"||echo"$a<$b"test-e"$f1"-a-r"$f1"&&echo"$f1isreadable"||echo"$f1isnotexistornotreadable"[zys@centos8shell]$shmyscript.sh11<16myscript.shisreadable3運算符與條件測試和test命令等價,支持關(guān)系運算、字符串運算、文件測試及布爾運算表達式的格式有特別的規(guī)定:操作數(shù)、運算符及中括號要用空格分隔[]條件測試[zys@centos8shell]$vimmyscript.sh
#!/bin/basha=11;b=16fname="myscript.sh"[$a-eq$b]&&echo"$a=$b"||echo"$a!=$b"[-n"$fname"-a"$fname"!="file2"]&&echo"'$fname'!='file2'"\ #換行輸入||echo"'$fname'isnullor'$fname'='file2'"[-w"$fname"]&&echo"$fnameiswritable"||echo"$fnameisnotwritable"[zys@centos8shell]$shmyscript.sh11!=16'myscript.sh'!='file2'myscript.shiswritable3運算符與條件測試4分支結(jié)構(gòu)以關(guān)鍵字if開頭,后跟條件測試表達式。條件表達式可以只包含單一的條件測試,也可以是多個條件測試組成的復(fù)合表達式關(guān)鍵字then可以和if處于同一行,也可以換行書寫。處于同一行時,必須在條件表達式后添加分號“;”當條件表達式成立時,可以執(zhí)行一條或多條命令以關(guān)鍵字fi結(jié)束基本的if語句if條件表達式;then
條件表達式成立時執(zhí)行的命令fi4分支結(jié)構(gòu)基本的if語句-示例[zys@centos8shell]$vimmyscript.sh
#!/bin/bashread-p"DoyoulikeCentOSLinux(Y/N):"ans #從鍵盤讀入ans變量值if["$ans"=="y"]||["$ans"=="Y"];then #如果ans是y或Y echo"Verygood!!!"fiif["$ans"=="n"]||["$ans"=="N"];then #如果ans是n或N echo"Oh,I'msorrytohearthat!!!"fi[zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):Y <==輸入“Y”Verygood!!!4分支結(jié)構(gòu)簡單if-else語句[zys@centos8shell]$vimmyscript.sh
#!/bin/bashread-p"DoyoulikeCentOSLinux(Y/N):"ansif["$ans"=="y"]||["$ans"=="Y"];then echo"Verygood!!!"else #如果if中的條件不成立
echo"Oh,I'msorrytohearthat!!!"fi[zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):YVerygood!!!4分支結(jié)構(gòu)if條件表達式;then
條件表達式成立時執(zhí)行的命令else
條件表達式不成立時執(zhí)行的命令fi用關(guān)鍵字else指定當if條件不成立時執(zhí)行哪些命令復(fù)雜if-else語句[zys@centos8shell]$vimmyscript.sh
#!/bin/bashread-p"DoyoulikeCentOSLinux(Y/N):"ansif["$ans"=="y"]||["$ans"=="Y"];then echo"Verygood!!!"elif["$ans"=="n"]||["$ans"=="N"];then echo"Oh,I'msorrytohearthat!!!"else #如果if和elif中的條件都不成立
echo"Wronganswer!!!"fi[zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):
NOh,I'msorrytohearthat!!![zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):
XWronganswer!!!4分支結(jié)構(gòu)if條件表達式1;then
條件表達式1成立時執(zhí)行的命令elif條件表達式2;then
條件表達式2成立時執(zhí)行的命令…else
所有條件都不成立時執(zhí)行的命令fi從條件表達式1開始檢查,執(zhí)行條件成立時對應(yīng)的命令如果所有的表達式都不成立,執(zhí)行else對應(yīng)的命令嵌套if語句[zys@centos8shell]$vimmyscript.sh
#!/bin/bashread-p"DoyoulikeCentOSLinux(Y/N):"ansif["$ans"=="y"]||["$ans"=="Y"];then read-p"Areyousure(Y/N):"ans_confirm if["$ans_confirm"=="y"]||["$ans_confirm"=="Y"];then echo"Verygood!!!" fielif["$ans"=="n"]||["$ans"=="N"];then echo"Oh,I'msorrytohearthat!!!"else echo"Wronganswer!!!"fi4分支結(jié)構(gòu)內(nèi)層的if語句在語法上和外層的if語句完全相同[zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):YAreyousure(Y/N):
YVerygood!!!執(zhí)行腳本5循環(huán)結(jié)構(gòu)while循環(huán)while[循環(huán)表達式];do
循環(huán)體done5循環(huán)結(jié)構(gòu)while[循環(huán)表達式]do
循環(huán)體done反復(fù)執(zhí)行某種有規(guī)律的操作,直到條件不成立while循環(huán)主要用于執(zhí)行次數(shù)不確定的某種操作只要循環(huán)表達式為真,就執(zhí)行循環(huán)體,除非循環(huán)表達式不成立或while循環(huán)5循環(huán)結(jié)構(gòu)關(guān)鍵字while后跟循環(huán)表達式,簡單條件測試表達式或復(fù)合表達式關(guān)鍵字do和done之間的命令稱為循環(huán)體執(zhí)行順序:首先檢查表達式是否成立,成立則執(zhí)行循環(huán)體中的命令,否則退出while循環(huán)結(jié)構(gòu)。循環(huán)體執(zhí)行完之后,再次進行相同檢查若表達式第一次的檢查結(jié)果為假,則直接退出循環(huán)結(jié)構(gòu)循環(huán)體中應(yīng)該包含影響循環(huán)表達式結(jié)果的操作,否則while循環(huán)就會因為循環(huán)表達式永遠為真而陷入“死循環(huán)”while循環(huán)-示例5循環(huán)結(jié)構(gòu)[zys@centos8shell]$vimmyscript.sh
#!/bin/bashrandom_num=$(($RANDOM*100/32767)) #生成0~99的隨機數(shù)read-p"Inputyourguess:"guess_num #獲取用戶輸入while[$random_num-ne$guess_num] #如果不相等就一直執(zhí)行do if[$random_num-gt$guess_num];then read-p"Inputabiggernum:"guess_num else read-p"Inputasmallernum:"guess_num fidoneecho"Great!!!"until循環(huán)until[循環(huán)表達式];do
循環(huán)體done5循環(huán)結(jié)構(gòu)until[循環(huán)表達式]do
循環(huán)體done和while循環(huán)的含義正好相反執(zhí)行順序:當循環(huán)表達式為真時結(jié)束循環(huán),否則一直執(zhí)行循環(huán)體或until循環(huán)-示例5循環(huán)結(jié)構(gòu)[zys@centos8shell]$vimmyscript.sh
#!/bin/bashrandom_num=$(($RANDOM*100/32767))read-p"Inputyourguess:"guess_numuntil[$random_num-eq$guess_num] doif[$random_num-gt$guess_num];then read-p"Inputabiggernum:"guess_numelse read-p"Inputasmallernum:"guess_numfidoneecho"Great!!!"[zys@centos8shell]$shmyscript.shInputyourguess:50Inputabiggernum:75Inputabiggernum:87Inputasmallernum:81Inputabiggernum:84Inputabiggernum:86Great!!!執(zhí)行腳本for循環(huán)-第1種形式forvarinvalue_list;do
循環(huán)體done5循環(huán)結(jié)構(gòu)forvarinvalue_listdo
循環(huán)體done主要用于執(zhí)行次數(shù)確定的某種操作如果事先知道循環(huán)要執(zhí)行多少次,使用for循環(huán)最合適把循環(huán)變量var設(shè)為value_list中的一個值,然后代入循環(huán)體執(zhí)行,直到value_list中的每個值都使用一遍或for循環(huán)-第1種形式(示例)5循環(huán)結(jié)構(gòu)[zys@centos8shell]$vimmyscript.sh
#!/bin/bashi=1;j=1echo'parametersfrom$*are:'forvarin"$*" #把$*中的每個值代入循環(huán)do echo"parameter$i:"$var i=$(($i+1))doneecho'parametersfrom$@are:'forvarin"$@" #把$@中的每個值代入循環(huán)do echo"parameter$j:"$var j=$(($j+1))done[zys@centos8shell]$shmyscript.shJiangsuChinaparametersfrom$*are:parameter1:JiangsuChinaparametersfrom$@are:parameter1:Jiangsuparameter2:China執(zhí)行腳本for循環(huán)-第2種形式5循環(huán)結(jié)構(gòu)for((初始化操作;循環(huán)表達式;賦值操作))do
循環(huán)體done循環(huán)變量的取值一般是一個整數(shù)通過控制取值的上限或下限確定循環(huán)體的執(zhí)行次數(shù)第1步,為循環(huán)變量賦初始值第2步,如果循環(huán)表達式成立,則進入第3步執(zhí)行循環(huán)休,否則退出for循環(huán)第3步,執(zhí)行循環(huán)體第4步,改變循環(huán)變量
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基建科工程施工范本合同
- 三農(nóng)村人居環(huán)境整治實施方案
- 公務(wù)車輛定點維修合同
- 法人向公司借款合同
- 經(jīng)典房地產(chǎn)開發(fā)的合同
- 編程語言高級應(yīng)用作業(yè)指導(dǎo)書
- 養(yǎng)殖業(yè)專業(yè)作業(yè)指導(dǎo)書
- 企業(yè)智能核能技術(shù)與應(yīng)用作業(yè)指導(dǎo)書
- 軟件技術(shù)開發(fā)與測試作業(yè)指導(dǎo)書
- 高港區(qū)二手房買賣合同
- 小學(xué)六年級數(shù)學(xué)上冊《簡便計算》練習(xí)題(310題-附答案)
- 青海省西寧市海湖中學(xué)2025屆中考生物仿真試卷含解析
- 2024年河南省《輔警招聘考試必刷500題》考試題庫及答案【全優(yōu)】
- 2024年中國養(yǎng)老產(chǎn)業(yè)商學(xué)研究報告-銀發(fā)經(jīng)濟專題
- 高教版2023年中職教科書《語文》(基礎(chǔ)模塊)下冊教案全冊
- 人教版英語七年級上冊閱讀理解專項訓(xùn)練16篇(含答案)
- 幼小銜接學(xué)拼音
- 有限空間辨識參考目錄圖片對照版
- 成本會計第一章總論
- 橋式起重機試驗項目及其內(nèi)容方法和要求
- GA∕T 1193-2014 人身損害誤工期、護理期、營養(yǎng)期評定
評論
0/150
提交評論