




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
項目9學習Shell腳本任務1BashShell基礎認識BashShell12Bash變量3通配符和特殊符號4重定向操作5Bash命令流6命令別名和歷史記錄1認識BashShell1認識BashShellShell位于操作系統內核外層,為用戶提供一個與內核交互的操作環境通過Shell完成工作往往效率更高Shell兼容性較好,在不同的Linux發行版中使用方式相同自動化運維是學習Shell的重要原因什么是Shellwhere
there’sashell,there’saway1認識BashShellBourneShell:UNIX操作系統最初使用的ShellBash:Linux的默認Shell,是BourneShell的擴展和超集csh(CShell):BSDUNIX的默認Shell,已被tcsh取代ksh(KornShell):編程和交互功能優秀,許多系統安裝腳本都使用ksh編寫ZShell:Linux系統里最龐大的一種Shell,使用復雜,一般不使用常見的Shell1認識BashShell歷史命令:保存執行過的命令,可以快速重復執行命令別名:將長命令簡化為短命令,或用習慣用法代替命令和文件路徑補全:通過Tab鍵快速輸入命令名或路徑名通配符:快速查找和處理文件管道和重定向:最常使用的操作之一Bash的主要功能和特性2Bash變量2Bash變量變量:用一個固定的字符串代表可能發生變化的內容包含變量名和變量值兩個要素變量可以簡化Shell腳本的編寫,使Shell腳本更簡潔也更易維護變量為進程間共享數據提供了一種新的手段Bash變量fname=/home/zys/tmp/file1變量名變量值兩種形式:$var_name或${var_name}使用echo命令輸出變量值讀取變量值[zys@centos8~]$echo$SHELL //第1種方法,SHELL是一個環境變量/bin/bash <==這是SHELL變量的值[zys@centos8~]$echo${SHELL} //第2種方法/bin/bash[zys@centos8~]$echo${shell} //shell變量未定義
<==變量值為空[zys@centos8~]$兩種方式有區別2Bash變量使用變量之前必須先定義一個變量并設置變量的值用“=”連接變量名和變量值:var_name=var_value設置變量值[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變量變量名由字母、數字和下劃線組成,但首字符不能是數字設置變量值是,“=”左右不能直接連接空格變量值中有空格,可以使用雙引號或單引號把變量值括起來設置變量的規則[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變量用命令的執行結果為變量賦值:`command`或$(command)通過read命令將用戶的鍵盤輸入賦值給變量:readvar_name設置變量的規則(續)[zys@centos8~]$curdate=`date` //使用反單引號獲取命令執行結果[zys@centos8~]$echo$curdate2024年02月28日星期三19:24:08CST[zys@centos8~]$curdate=$(date) //使用小括號獲取命令執行結果[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命令修改變量的數據類型declare命令僅支持整數的數值運算設置變量的規則(續)[zys@centos8~]$declare-ivar=3*7 //將變量var聲明為整數[zys@centos8~]$echo$var21[zys@centos8~]$var=8/5 //取整[zys@centos8~]$echo$var1[zys@centos8~]$var=2.3 //賦值為浮點數bash:2.3:語法錯誤:無效的算術運算符(錯誤符號是".3")2Bash變量使用unset取消或刪除變量,在unset命令后跟變量名即可刪除變量[zys@centos8~]$echo$myshellmyshellis/bin/bash[zys@centos8~]$unsetmyshell //刪除變量[zys@centos8~]$echo$myshell <==變量已刪除,值為空[zys@centos8~]$2Bash變量操作系統內置的變量在登錄操作系統后就默認存在,多用于保存重要的系統參數環境變量可以被系統中所有的應用共享使用env和export命令查看系統當前的環境變量環境變量[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$$)執行成功[zys@centos8~]$ls/etc/centos-release2ls:無法訪問'/etc/centos-release2':沒有那個文件或目錄[zys@centos8~]$echo$?2 <==上一個命令(即lsfile11)執行異常[zys@centos8~]$echo$?0 <==上一個命令(即echo$?)執行成功
$$:查看當前Bash進程的PID
$?:返回上一個命令的執行結果,0表示成功,非0表示失敗或異常2Bash變量變量的作用范圍[zys@centos8~]$p_var="variableinparentprocess" //在父進程定義的變量[zys@centos8~]$bash //使用bash命令創建子進程[zys@centos8~]$echo$p_var //這里已經處于子進程的工作界面
<==子進程中沒有p_var變量,所以輸出為空[zys@centos8~]$exit //退出子進程exit[zys@centos8~]$ //返回父進程的工作界面一個Bash窗口對應一個Bash進程,執行的命令也都是(子)進程子進程運行時,父進程一般處于“睡眠”狀態子進程執行完畢,父進程重新開始運行默認情況下子進程不會繼承父進程定義的變量2Bash變量變量的作用范圍(續)[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)用特定的符號表示文件名的某種模式遇到這些特定的符號,就用相應的模式對文件名進行擴展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開頭,后跟一個數字的文件f1f2特殊符號盡量避免使用特殊符號為文件命名3通配符和特殊符號4重定向操作重定向基本概念默認情況下,標準輸入是鍵盤,標準輸出是屏幕(即顯示器)Linux命令從鍵盤獲得輸入,并把執行結果在屏幕中顯示出來重定向:重新指定命令的輸入和輸出有輸入重定向和輸出重定向之分4重定向操作輸出重定向-覆蓋原文件[zys@centos8tmp]$pwd/home/zys/tmp <==執行結果默認顯示在屏幕中[zys@centos8tmp]$pwd>pwd.result //將執行結果輸出到文件pwd.result中[zys@centos8tmp]$catpwd.result
/home/zys/tmp在命令之后輸入大于號“>”并且后跟一個文件名對原文件的內容進行了“覆蓋”,即清空原文件內容4重定向操作輸出重定向-追加新內容[zys@centos8tmp]$catpwd.result
/home/zys/tmp <==當前內容[zys@centos8tmp]$ls-lF*
-rw-r--r--.1zysdevteam02月2921:11F1-rw-r--r--.1zysdevteam02月2921:11F2[zys@centos8tmp]$ls-lF*>>pwd.result //將ls命令的結果追加到文件pwd.result中[zys@centos8tmp]$catpwd.result
/home/zys/tmp-rw-r--r--.1zysdevteam02月2921:11F1-rw-r--r--.1zysdevteam02月2921:11F2使用兩個大于號“>>”實現“追加”的效果在原文件的基礎上“追加”新內容4重定向操作輸入重定向[zys@centos8tmp]$vimf1 //添加下面兩行內容23+34 12*3[zys@centos8tmp]$bc<f2 //輸入重定向:從文件f1中獲得輸入內容5736[zys@centos8tmp]$bc<f1>f2 //同時進行輸入重定向和輸出重定向[zys@centos8tmp]$catf25736將原來從鍵盤輸入的數據改為從文件讀取可以同時使用輸入輸出重定向4重定向操作5Bash命令流連續執行命令-命令間沒有依賴關系[zys@centos8tmp]$clear;ls //依次執行clear和ls兩條命令f1F1f2F2file1file2pwd.result命令間用分號“;”分隔,只要按一次Enter鍵,這些命令就會被依次執行適合于命令之間沒有依賴關系的情況不管前一條命令成功或失敗,后一條命令都會執行5Bash命令流連續執行命令-命令間有依賴關系[zys@centos8~]$cdbin&&touchfile1 //如果cd命令執行成功就接著執行touch命令-bash:cd:bin:沒有那個文件或目錄 <==cd命令執行失敗[zys@centos8~]$cdbin||mkdirbin //如果cd命令執行失敗就接著執行mkdir命令-bash:cd:bin:沒有那個文件或目錄 [zys@centos8~]$ls-ldbindrwxr-xr-x.2zysdevteam62月2921:31bin <==目錄bin已創建命令間用“&&”或“||”連接用“$?”查看前一條命令執行結果5Bash命令流管道命令[zys@centos8~]$cat/etc/os-release|wc //wc命令把cat命令的輸出作為輸入
1317333[zys@centos8~]$cat/etc/os-release|wc|wc //連續使用兩次管道命令
1324功能:一個命令的輸出成為另一個命令的輸入使用管道符號“|”連接兩個命令,左側命令的輸出成為右側命令的輸入可以在一條命令中多次使用管道符號以實現更復雜的操作5Bash命令流命令別名功能:簡化復雜的命令,或者以自己習慣的方式使用命令如果沒有alias關鍵字,別名的設置和Bash變量幾乎是相同的單獨使用alias命令可以查看Bash當前已設置的別名使用別名還可以替換系統已有的命令在命令行中設置的命令別名只對當前Bash進程有效如果想刪除已設置的命令別名,可以使用unalias命令5Bash命令流alias命令別名=’命令[選項][參數]’命令歷史記錄功能:保存命令行窗口中執行過的命令以便后續查找或執行命名保存在歷史命令文件中,并且為每條命令分配唯一的編號使用history命令處理和歷史命令相關的操作HISTSIZE變量指定history命令最多可以顯示的命令條數,默認值是1000歷史命令文件一般是~/.bash_history,由HISTFILE變量指定HISTFILESIZE變量指定歷史命令文件最多可以保存的命令總數,默認值是10005Bash命令流命令歷史記錄(續)重復執行上一條命令在命令行中輸入“!!”或“!-1”可以快速執行上一條命令“!-n”表示執行最近的第n條命令按【Ctrl+P】或鍵盤的向上方向鍵調出最近一條命令,按回車鍵執行通過命令編號執行歷史命令使用“!n”可以快速執行編號為n的歷史命令通過命令關鍵字執行歷史命令使用“!cmd”可以查找最近一條以cmd開頭的命令并執行通過【Ctrl+R】組合鍵搜索歷史命令使用【Ctrl+R】組合鍵對歷史命令進行搜索,按回車鍵即可執行5Bash命令流任務2正則表達式正則表達式概述12基礎正則表達式1正則表達式概述1正則表達式概述管理員經常需要提取特定信息,或者對文件的內容進行查找、替換或刪除操作正則表達式提高了系統管理員的工作效率和準確性正則表達式使用一系列符號對字符串進行模式匹配支持正則表達式的工具有很多,如grep、vim、sed、awk等驗證數據的有效性替換文本內容從字符串中提取子字符串什么是正則表達式2基礎正則表達式2基礎正則表達式基礎正則表達式-示例文件[zys@centos8tmp]$cat-nreg_file //正則表達式示例文件
1 Repeatthedoseafter12hoursifnecessary2 Shedozedoffinfrontofthefirewithher"cat"3 4 HehesitatedforthemerestfrActionofasecond,5 andhesaid:"ohhhhhhhhho,ithurtsme"直接查找特定的字符串如果字符串包含空格,可以將其包含在單引號或雙引號中如果字符串中包含特殊字符,可以使用轉義符“\”基礎正則表達式-匹配普通字符串[zys@centos8tmp]$grep-ndosereg_file //匹配普通字符串1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n'forthe'reg_file //使用引號包含空格4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n\"cat\"reg_file //使用轉義符2:Shedozedoffinfrontofthefirewithher"cat"2基礎正則表達式在“[]”中包含一個或多個大寫字母、小寫字母或數字的任意組合正則表達式只會匹配其中的一個字符(英文字母和數字都是字符)基礎正則表達式-匹配字符集合[zys@centos8tmp]$grep-n'do[sz]e'reg_file //匹配字符集合1:Repeatthedoseafter12hoursifnecessary2:Shedozedoffinfrontofthefirewithher"cat"[zys@centos8tmp]$grep-n'fr[oA][nc]t'reg_file //連續匹配字符集合2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基礎正則表達式在“[]”中使用“-”表示某一范圍的數字和字母“[a-z]”表示從a到z的任意一個小寫字母“[A-Z]”表示從A到Z的任意一個大寫字母“[0-9]”表示從0到9的任意一個數字基礎正則表達式-匹配字符范圍[zys@centos8tmp]$grep-n'fr[a-zA-Z][a-z]t'reg_file //連續匹配字符范圍2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基礎正則表達式“[-]”的有效性依賴于系統的語言設置可以使用特殊符號表示特定范圍的字符基礎正則表達式-特殊符號[zys@centos8tmp]$grep-n'[[:digit:]]'reg_file1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n'[[:punct:]]'reg_file2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,5:andhesaid:"ohhhhhhhhho,ithurtsme"2基礎正則表達式“[^]”表示對“[]”中的內容進行反向匹配不包括“[]”中的任意一個字符基礎正則表達式-反向字符匹配[zys@centos8tmp]$grep-n'[^hH]er'reg_file //字符反向匹配:er前沒有h和H1:Repeatthedoseafter12hoursifnecessary4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n'[^a-zA-Z]f'reg_file //結合使用反向匹配和字符范圍2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n'[^[:blank:]]he'reg_file//結合使用反向匹配和特殊符號1:Repeatthedoseafter12hoursifnecessary2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基礎正則表達式“^str”和“str$”分別表示以字符串str開頭和結尾的行基礎正則表達式-匹配行首和行尾[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基礎正則表達式“.”表示匹配任意一個字符一個“.”只能匹配一個字符基礎正則表達式-匹配任意字符[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基礎正則表達式“*”表示其前面的字符可以重復出現0次、一次或多次基礎正則表達式-匹配重復字符[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出現0或多次1:Repeatthedoseafter12hoursifnecessary2:Shedozedoffinfrontofthefirewithher"cat"3:4:HehesitatedforthemerestfrActionofasecond,5:andhesaid:"ohhhhhhhhho,ithurtsme"2基礎正則表達式“\{m,n\}”表示字符可以出現m~n次基礎正則表達式-匹配精確字符數[zys@centos8tmp]$grep-n'oh\{5,9\}o'reg_file//o之后的h出現5~9次5:andhesaid:"ohhhhhhhhho,ithurtsme"[zys@centos8tmp]$grep-n's\{2\}'reg_file //s出現2次1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n's\{1,\}'reg_file //s至少出現1次1:Repeatthedoseafter12hoursifnecessary4:HehesitatedforthemerestfrActionofasecond,5:andhesaid:"ohhhhhhhhho,ithurtsme"[zys@centos8tmp]$grep-n'off\{,1\}'reg_file //of之后的f至多出現1次2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基礎正則表達式基礎正則表達式-總結2基礎正則表達式任務3Shell腳本認識Shell腳本12腳本執行與返回值3運算符與條件測試4分支結構5循環結構6Shell函數1認識Shell腳本Shell腳本是一組Linux命令的集合把腳本文件提交給Bash解釋執行支持以編程的方式編寫命令支持自動化運維Shell腳本基本概念[zys@centos8~]$cdshell[zys@centos8shell]$vimmyscript.sh#!/bin/bash#Thisismyfirstshellscriptecho"Helloworld..."1認識Shell腳本2腳本執行與返回值設置腳本文件的可執行權限指定腳本文件的絕對路徑或相對路徑直接執行腳本執行方式-為腳本文件添加執行權限[zys@centos8shell]$chmoda+xmyscript.sh //為腳本文件添加執行權限[zys@centos8shell]$ls-lmyscript.sh-rwxr-xr-x.1zysdevteam672月2922:39myscript.sh[zys@centos8shell]$./myscript.sh //輸入腳本文件名直接執行Helloworld...2腳本執行與返回值使用sh或bash命令執行腳本文件,把文件名作為參數sh其實是bash的鏈接文件不管腳本文件有沒有可執行權限,都可以采用這種方式執行腳本執行方式-使用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腳本執行與返回值使用source命令或點運算符“.”執行腳本文件,后跟腳本文件名腳本執行方式-source[zys@centos8shell]$sourcemyscript.sh //相當于.myscript.shHelloworld...2腳本執行與返回值前兩種方式,腳本文件在當前Bash進程的子進程中執行,在腳本文件中無法使用父進程創建的變量第3種方式則是直接在當前Bash進程中執行腳本執行方式-區別[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種執行方式Helloworld...currentpidis4428 <==子進程PIDvalueofp_varis'' <==變量值為空[zys@centos8shell]$sourcemyscript.sh //第3種執行方式Helloworld...currentpidis4278 <==父進程PIDvalueofp_varis'variableinparentprocess'2腳本執行與返回值Shell腳本的執行順序是從上至下、從左至右出現在“#”之后的內容為注釋,除非“#”是字符串的一部分第1行一般是以“#!”開頭,說明腳本文件的屬性對于空行、空格或制表符(Tab)直接忽略把回車符當作一條命令的結束符,讀到回車符就開始執行命令在行末輸入轉義符“\”換行繼續輸入命令腳本執行順序2腳本執行與返回值腳執行結束,都會返回一個整數類型的狀態碼一般用0表示執行成功,用非0值表示異常結束可以使用“$?”特殊變量查看狀態碼還可以使用exit命令指定返回值,形式為exitn,取值范圍是0~255腳本狀態碼[zys@centos8shell]$vimmyscript.sh#!/bin/bashecho"Helloworld..."exit0 #在腳本中指定退出狀態碼為0[zys@centos8shell]$shmyscript.shHelloworld...[zys@centos8shell]$echo$?02腳本執行與返回值可以向腳本文件傳遞參數常用的表示方法:$n$#$*$@腳本參數[zys@centos8shell]$vimmyscript.sh
#!/bin/bashecho"Helloworld..."echo"I'mfrom$1,$2"echo"Totalof$#parameters:$@"[zys@centos8shell]$shmyscript.shJiangsuChina //輸入兩個參數Helloworld...I'mfromJiangsu,ChinaTotalof2parameters:JiangsuChina2腳本執行與返回值3運算符與條件測試采用“$((exp))”的形式,內層的小括號中是算術表達式“$(())”只支持整數的算術運算表達式中的變量可以不使用“$”前導符號算術運算[zys@centos8shell]$vimmyscript.sh
#!/bin/basha=5;b=6echo$((5+6))echo$(($a+$b))[zys@centos8shell]$shmyscript.sh
11113運算符與條件測試采用“$((exp
))”進行整數間的算術比較運算運算符包括“<”“>”“<=”“>=”“==”“!=”如果比較結果為真,表達式返回1,否則返回0算術運算(續)[zys@centos8shell]$vimmyscript.sh#!/bin/basha=5;b=6echo$((a>b))echo$((a!=b))[zys@centos8shell]$shmyscript.sh
013運算符與條件測試采用“$((exp
))”進行整數間的算術比較運算運算符包括“<”“>”“<=”“>=”“==”“!=”如果比較結果為真,表達式返回1,否則返回0算術運算(續)[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條件測試-關系運算#!/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條件測試-文件權限和比較測試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命令等價,支持關系運算、字符串運算、文件測試及布爾運算表達式的格式有特別的規定:操作數、運算符及中括號要用空格分隔[]條件測試[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分支結構以關鍵字if開頭,后跟條件測試表達式。條件表達式可以只包含單一的條件測試,也可以是多個條件測試組成的復合表達式關鍵字then可以和if處于同一行,也可以換行書寫。處于同一行時,必須在條件表達式后添加分號“;”當條件表達式成立時,可以執行一條或多條命令以關鍵字fi結束基本的if語句if條件表達式;then
條件表達式成立時執行的命令fi4分支結構基本的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分支結構簡單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分支結構if條件表達式;then
條件表達式成立時執行的命令else
條件表達式不成立時執行的命令fi用關鍵字else指定當if條件不成立時執行哪些命令復雜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分支結構if條件表達式1;then
條件表達式1成立時執行的命令elif條件表達式2;then
條件表達式2成立時執行的命令…else
所有條件都不成立時執行的命令fi從條件表達式1開始檢查,執行條件成立時對應的命令如果所有的表達式都不成立,執行else對應的命令嵌套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分支結構內層的if語句在語法上和外層的if語句完全相同[zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):YAreyousure(Y/N):
YVerygood!!!執行腳本5循環結構while循環while[循環表達式];do
循環體done5循環結構while[循環表達式]do
循環體done反復執行某種有規律的操作,直到條件不成立while循環主要用于執行次數不確定的某種操作只要循環表達式為真,就執行循環體,除非循環表達式不成立或while循環5循環結構關鍵字while后跟循環表達式,簡單條件測試表達式或復合表達式關鍵字do和done之間的命令稱為循環體執行順序:首先檢查表達式是否成立,成立則執行循環體中的命令,否則退出while循環結構。循環體執行完之后,再次進行相同檢查若表達式第一次的檢查結果為假,則直接退出循環結構循環體中應該包含影響循環表達式結果的操作,否則while循環就會因為循環表達式永遠為真而陷入“死循環”while循環-示例5循環結構[zys@centos8shell]$vimmyscript.sh
#!/bin/bashrandom_num=$(($RANDOM*100/32767)) #生成0~99的隨機數read-p"Inputyourguess:"guess_num #獲取用戶輸入while[$random_num-ne$guess_num] #如果不相等就一直執行do if[$random_num-gt$guess_num];then read-p"Inputabiggernum:"guess_num else read-p"Inputasmallernum:"guess_num fidoneecho"Great!!!"until循環until[循環表達式];do
循環體done5循環結構until[循環表達式]do
循環體done和while循環的含義正好相反執行順序:當循環表達式為真時結束循環,否則一直執行循環體或until循環-示例5循環結構[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!!!執行腳本for循環-第1種形式forvarinvalue_list;do
循環體done5循環結構forvarinvalue_listdo
循環體done主要用于執行次數確定的某種操作如果事先知道循環要執行多少次,使用for循環最合適把循環變量var設為value_list中的一個值,然后代入循環體執行,直到value_list中的每個值都使用一遍或for循環-第1種形式(示例)5循環結構[zys@centos8shell]$vimmyscript.sh
#!/bin/bashi=1;j=1echo'parametersfrom$*are:'forvarin"$*" #把$*中的每個值代入循環do echo"parameter$i:"$var i=$(($i+1))doneecho'parametersfrom$@are:'forvarin"$@" #把$@中的每個值代入循環do echo"parameter$j:"$var j=$(($j+1))done[zys@centos8shell]$shmyscript.shJiangsuChinaparametersfrom$*are:parameter1:JiangsuChinaparametersfrom$@are:parameter1:Jiangsuparameter2:China執行腳本for循環-第2種形式5循環結構for((初始化操作;循環表達式;賦值操作))do
循環體done循環變量的取值一般是一個整數通過控制取值的上限或下限確定循環體的執行次數第1步,為循環變量賦初始值第2步,如果循環表達式成立,則進入第3步執行循環休,否則退出for循環第3步,執行循環體第4步,改變循環變量
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 27《我堅持我成功》教學設計-2023-2024學年心理健康四年級下冊北師大版
- 18文言文二則《鐵杵成針》教學設計-2023-2024學年統編版語文四年級下冊
- 《冰融化了》教學設計-2024-2025學年科學三年級上冊教科版
- 七年級生物下冊 第三單元 第二章 人的生活需要空氣 第三節 呼吸保健與急救教學設計設計(新版)濟南版
- 2018春蘇科版八年級生物下冊第八單元第24章同步教學設計:8.24.1人體的免疫防線
- 行政工作總結課件
- 2023三年級英語上冊 Unit 4 I have a ball Lesson 20教學設計 人教精通版(三起)
- 9 端午粽 教學設計-2024-2025學年語文一年級下冊統編版
- Unit 2 No Rules No Order Section A(2a~2f)教學設計-2024-2025學年人教版英語七年級下冊
- Unit 9 Section B 2a-2e 教學設計2024-2025學年人教版八年級英語下冊
- 商務英語綜合教程4-Unit1
- 裝配式混凝土建筑預制疊合板、疊合梁識圖
- DZ∕T 0130-2006 地質礦產實驗室測試質量管理規范(正式版)
- 小學三年發展規劃(2024-2026)
- 2024屆江蘇省南京市、鹽城市高三第二次模擬考試英語試題二次開發字詞積累導學案
- 2010年10月自考00567馬列文論選讀試題及答案含解析
- 2023年河北省中考數學試卷及答案
- 生理學全套課件
- 物業工作拍照技巧培訓課件
- 小學特色課程《口風琴課程》校本教材
- 《新疆大學版學術期刊目錄》(人文社科)
評論
0/150
提交評論