Linux操作系統(tǒng)項目化教程 課件 項目3 使用vim編輯器與shell_第1頁
Linux操作系統(tǒng)項目化教程 課件 項目3 使用vim編輯器與shell_第2頁
Linux操作系統(tǒng)項目化教程 課件 項目3 使用vim編輯器與shell_第3頁
Linux操作系統(tǒng)項目化教程 課件 項目3 使用vim編輯器與shell_第4頁
Linux操作系統(tǒng)項目化教程 課件 項目3 使用vim編輯器與shell_第5頁
已閱讀5頁,還剩76頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

使用vim編輯器使用shell環(huán)境變量項目3使用Vim編輯器與shell輸入輸出重定向和管道命令shell編程02熟練掌握shell環(huán)境變量03掌握輸入/輸出重定向與管道熟練使用vim編輯器01目錄04shell編程學習目標知識目標熟悉Linux命令的結(jié)構(gòu)熟悉Linux常用命令的用法理解Linux重定向與管道命令及用法能力目標能使用常用命令對Linux操作系統(tǒng)進行管理能使用vim編輯器對文件進行編輯能使用重定向和管道命令素養(yǎng)目標培養(yǎng)職業(yè)素養(yǎng)培養(yǎng)科學精神和愛國情懷注冊全局組件【項目導入】系統(tǒng)管理員的一項重要工作是修改與設定某些重要軟件的配置文件,因此系統(tǒng)管理員至少要學會使用一種以上文字接口的文本編輯器。所有的Linux發(fā)行版本都內(nèi)置了vim。vim不但可以用不同顏色顯示文本內(nèi)容,還能夠進行諸如shellscript、c等程序的編輯。掌握Linux常用命令和vim編輯器是學好Linux的必備基礎。如果想要管理好屬于你的主機,那么一定要好好學習shellscript。shellscript有點像是早期的批處理,即將一些命令匯總起來一次運行。但是shellscript擁有更強大的功能,那就是它可以進行類似程序(program)的撰寫,并且不需要經(jīng)過編譯(compile)就能夠運行,非常方便。同時,我們還可以通過shellscript來簡化我們?nèi)粘5墓ぷ鞴芾?。任務一熟練使用vim編輯器vim可以執(zhí)行輸出、刪除、查找、替換、塊操作等眾多文本操作,而且用戶可以根據(jù)自己的需要對其進行定制。vim不是一個排版程序,它不像Word或WPS那樣可以對字體、格式、段落等其他屬性進行編排,它只是一個文本編輯程序。vim是全屏幕文本編輯器,沒有菜單,只有命令。任務一熟練使用vim編輯器1)編輯模式進入vim之后,首先進入的就是編輯模式。進入編輯模式后,vim等待編輯命令輸入而不是文本輸入。2)輸入模式在編輯模式下按下相應的鍵可以進入輸入模式:插入命令i、附加命令a、打開命令o、修改命令c、取代命令r或替換命令s都可以進入輸入模式。在文本輸入過程中(輸入模式下),若想回到編輯模式下,按“Esc”鍵即可。3)命令模式在編輯模式下,用戶按“:”鍵即可進入命令模式。若在命令模式下輸入命令的過程中改變了主意,可在用退格鍵將輸入的命令全部刪除之后,再按一下退格鍵,即可使vim回到編輯模式。1.vim的工作模式任務一熟練使用vim編輯器4)vim的工作模式切換圖vim的三種工作模式之間可以相互切換,其工作模式切換圖如圖所示(圖2.2.jpg)。任務一熟練使用vim編輯器1)在編輯模式下的命令說明在編輯模式下,光標移動、查找與替換、復制粘貼等的說明分別如表1、表2和表3所示。2.使用vim命令表1編輯模式下的光標移動的說明表2編輯模式下的查找與替換的說明表3編輯模式下刪除、復制與粘貼的說明任務一熟練使用vim編輯器2)在輸入模式下的命令說明編輯模式切換到輸入模式的可用的按鍵的相關說明如下表所示(表4)。表4進入輸入模式的說明任務一熟練使用vim編輯器3)命令模式的按鍵說明如果是輸入模式,先按“Esc”鍵進入編輯模式。在編輯模式下按“:”進入命令模式。保存文件、退出編輯等的命令按鍵如表5所示。表5命令模式的按鍵說明任務二熟練掌握shell環(huán)境變量shell是用戶與操作系統(tǒng)內(nèi)核之間的接口,起著協(xié)調(diào)用戶與系統(tǒng)的一致性和在用戶與系統(tǒng)之間進行交互的作用。1)變量的定義和引用在shell中,變量的賦值格式如下:name=string通過在變量名(name)前加$字符(如$name)引用變量的值,引用的結(jié)果就是用字符串string代替$name,此過程也稱為變量替換。在定義變量時,若string中包含空格、制表符和換行符,則string必須用'string'或者"string"的形式,即用單(雙)引號將其括起來。雙引號內(nèi)允許變量替換,而單引號內(nèi)則不可以。1.Shell環(huán)境變量任務二熟練掌握shell環(huán)境變量2)shell變量的作用域shell變量分為局部變量和全局變量。局部變量的作用范圍僅限制在其命令行所在的shell或shell腳本文件中。全局變量的作用范圍則包括本shell進程及其所有子進程??梢允褂胑xport內(nèi)置命令將局部變量設置為全局變量。下面給出一個shell變量作用域的例子。任務二熟練掌握shell環(huán)境變量//在當前shell中定義變量var1[root@RHEL7-1~]#var1=Linux//在當前shell中定義變量var2并將其輸出[root@RHEL7-1~]#var2=unix[root@RHEL7-1~]#exportvar2//引用變量的值[root@RHEL7-1~]#echo$var1Linux[root@RHEL7-1~]#echo$var2unix//顯示當前shell的PID[root@RHEL7-1~]#echo$$2670[root@RHEL7-1~]#//調(diào)用子shell[root@RHEL7-1~]#bash任務二熟練掌握shell環(huán)境變量//顯示當前shell的PID[root@RHEL7-1~]#echo$$2709//由于var1沒有被輸出,所以在子shell中已無值[root@RHEL7-1~]#echo$var1//由于var2被輸出,所以在子shell中仍有值[root@RHEL7-1~]#echo$var2unix//返回主shell,并顯示變量的值[root@RHEL7-1~]#exit[root@RHEL7-1~]#echo$$2670[root@RHEL7-1~]#echo$var1Linux[root@RHEL7-1~]#echo$var2unix[root@RHEL7-1~]#任務二熟練掌握shell環(huán)境變量3)環(huán)境變量環(huán)境變量是指由shell定義和賦初值的shell變量。shell用環(huán)境變量來確定查找路徑、注冊目錄、終端類型、終端名稱、用戶名等。所有環(huán)境變量都是全局變量,并可以由用戶重新設置。系統(tǒng)中常用的環(huán)境變量如下表所示(表6)。表6shell中的環(huán)境變量任務二熟練掌握shell環(huán)境變量不同類型的shell的環(huán)境變量有不同的設置方法。在bash中,設置環(huán)境變量用set命令,命令的格式是:set環(huán)境變量=變量的值【例1】設置用戶的主目錄為/home/test1。[root@test~]#setHOME=/home/test1【注意】不加任何參數(shù)地直接使用set命令可以顯示出用戶當前所有環(huán)境變量的設置。任務二熟練掌握shell環(huán)境變量4)命令運行的判斷依據(jù):;、&&、||(1)cmd;cmd(不考慮命令相關性的連續(xù)命令執(zhí)行)?!纠?】在關機的時候希望可以先運行兩次sync同步化寫入磁盤后才關機。[root@test~]#sync;sync;shutdown-hnow任務二熟練掌握shell環(huán)境變量(2)$?(命令回傳值)與“&&”或“||”。“&&”及“||”命令的執(zhí)行情況說明如下表所示(表7)。表7“&&”及“||”命令的執(zhí)行情況說明注意:兩個&之間是沒有空格的,那個“|”則是按“Shift+\”組合鍵的結(jié)果。任務二熟練掌握shell環(huán)境變量【例3】使用ls查閱目錄/tmp/abc是否存在,若存在,則用touch創(chuàng)建/tmp/abc/1.txt。[root@test~]#ls/tmp/abc&&touch/tmp/abc/1.txtls:無法訪問/tmp/abc:沒有那個文件或目錄[root@test~]#mkdir/tmp/abc[root@test~]#ls/tmp/abc&&touch/tmp/abc/1.txt[root@test~]#ll/tmp/abc總用量0-rw-r--r--.1rootroot08月1016:361.txt任務三掌握輸入/輸出重定向與管道1)使用重定向重定向就是不使用系統(tǒng)的標準輸入端口、標準輸出端口或標準錯誤端口,而進行重新的指定。重定向分為輸入重定向、輸出重定向和錯誤重定向。通常情況下,重定向到一個文件。在shell中,要實現(xiàn)重定向主要依靠重定向符。常用的重定向符如表8所示。1.輸入輸出重定向與管道命令任務三掌握輸入/輸出重定向與管道表8常用的重定向符任務三掌握輸入/輸出重定向與管道【例4】將ls命令生成的/tmp目錄的一個清單存到當前目錄中的dir文件中。[root@test~]#ls-l/tmp>dir【例5】將ls命令生成的/etc目錄的一個清單以追加的方式存到當前目錄中的dir文件中。[root@test~]#ls-l/etc>>dir【例6】passwd文件的內(nèi)容作為wc命令的輸入(wc命令用來計算數(shù)字,可以計算文件的Byte數(shù)、字數(shù)或是列數(shù),若不指定文件名稱,或是所給予的文件名為“-”,則wc指令會從標準輸入設備讀取數(shù)據(jù))。[root@test~]#wc</etc/passwd【例7】將命令myprogram的錯誤信息保存在當前目錄下的err_file文件中。[root@test~]#myprogram2>err_file任務三掌握輸入/輸出重定向與管道2)使用管道許多Linux命令具有過濾特性,即一條命令通過標準輸入端口接收一個文件中的數(shù)據(jù),命令執(zhí)行后產(chǎn)生的結(jié)果數(shù)據(jù)又通過標準輸出端口送給后一條命令,作為該命令的輸入數(shù)據(jù)。后一條命令也是通過標準輸入端口接收輸入數(shù)據(jù)。shell提供管道命令“|”將這些命令前后銜接在一起,形成一個管道線。格式為:

命令1|命令2|...|命令n管道線中的命令總是從左到右順序執(zhí)行的,所以管道線是單向的。【例8】統(tǒng)計登錄到系統(tǒng)且名稱包含root字符串的用戶。[root@test~]#who|greproot|wc-l任務四shell編程1.了解shellscriptshellscript——程序化腳本,是針對shell所寫的“腳本”。shellscript有點像是早期的批處理,即將一些命令匯總起來一次運行。但是shellscript擁有更強大的功能,那就是它可以進行類似程序(program)的撰寫,并且不需要經(jīng)過編譯(compile)就能夠運行,非常方便。另外,shellscript還具有不錯的排錯(debug)工具,所以它可以幫助系統(tǒng)管理員快速地管理好主機。任務四shell編程2.編寫與執(zhí)行第一個shellscript(1)在shellscript撰寫中的注意事項命令的執(zhí)行是從上而下、從左而右進行的。命令、選項與參數(shù)間的多個空格都會被忽略掉??瞻仔幸矊⒈缓雎缘?,并且按“Tab”鍵所生成的空白同樣被視為空格鍵。如果讀取到一個Enter符號(CR),就嘗試開始運行該行(或該串)命令。如果一行的內(nèi)容太多,則可以使用“\[Enter]”來延伸至下一行?!?”可作為注解。任何加在#后面的數(shù)據(jù)將全部被視為注解文字而被忽略。任務四shell編程(2)運行shellscript程序假設程序文件名是/home/dmtsai/shell.sh,運行程序的方法如下:(1)直接命令下達:shell.sh文件必須要具備可讀與可運行(rx)的權限。 絕對路徑:使用/home/dmtsai/shell.sh來下達命令。 相對路徑:假設工作目錄在/home/dmtsai/,則使用./shell.sh來運行。 變量“PATH”功能:將shell.sh放在PATH指定的目錄內(nèi),例如:~/bin/。(2)以bash程序來運行:通過“bashshell.sh”或“shshell.sh”來運行。任務四shell編程(3)編寫第一個shellscript程序在本項目中,請將所有撰寫的script放置到家目錄的~/scripts這個目錄內(nèi),以利于管理。[root@test~]#cd;mkdirscripts;cdscripts[root@testscripts]#vimsh01.sh#!/bin/bash#Program:#Thisprogramshows"HelloWorld!"inyourscreen.#History:#2022/08/23 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATHecho-e"HelloWorld!\a\n"exit0任務四shell編程【程序解析】:(1)第一行#!/bin/bash在宣告這個script使用的shell名稱;(2)程序內(nèi)容的說明。除了第一行的“#!”用來聲明shell之外,其他的#都是注釋;要養(yǎng)成說明該script的內(nèi)容與功能、版本信息、作者與聯(lián)系法式、建立日期、歷史記錄等習慣,有助于未來程序的改寫與調(diào)試。(3)主要環(huán)境變量的聲明。PATH與LANG是最重要的環(huán)境變量,務必設置好。可以讓程序在運行時直接執(zhí)行一些外部命令,而不必寫絕對路徑;(4)主要程序部分。本例中echo所在行即為主要程序部分;(5)運行結(jié)果告知(定義回傳值)。本例中,使用exit0,即離開script并且回傳一個0給系統(tǒng),當運行完成script后,若接著執(zhí)行echo$?,則可得到0的值。該程序運行結(jié)果如下:[root@testscripts]#shsh01.shHelloWorld!任務四shell編程3.養(yǎng)成撰寫shellscript的良好習慣養(yǎng)成良好的script撰寫習慣至關重要,在每個script的文件頭處包含如下內(nèi)容。

script的功能。

script的版本信息。

script的作者與聯(lián)絡方式。

script的版權聲明方式。

script的History(歷史記錄)。

script內(nèi)較特殊的命令,使用“絕對路徑”的方式來執(zhí)行。

script運行時需要的環(huán)境變量預先聲明與設置。任務四shell編程除了記錄這些信息之外,在較為特殊的程序部分,務必要加上注解說明。此外,程序的撰寫建議使用嵌套方式,最好能以“Tab”鍵的空格縮排。這樣程序會顯得非常漂亮、有條理,可以很輕松地閱讀與調(diào)試程序。另外,撰寫script的工具最好使用vim而不是vi,因為vim有額外的語法檢驗機制,能夠在第一階段撰寫時就發(fā)現(xiàn)語法方面的問題。任務四shell編程4.對話式腳本:變量內(nèi)容由使用者決定【例1】使用read命令撰寫一個script。讓用戶輸入firstname與lastname后,在屏幕上顯示“Yourfullnameis:”的內(nèi)容。[root@testscripts]#vimsh02.sh#!/bin/bash#Program:#Userinputshisfirstnameandlastname.Programshowshisfullname.#History:#2022/08/23 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATH

read-p"Pleaseinputyourfirstname:"firstname #提示使用者輸入read-p"Pleaseinputyourlastname:"lastname #提示使用者輸入echo-e"\nYourfullnameis:$firstname$lastname" #結(jié)果由屏幕輸出[root@testscripts]#shsh02.sh任務四shell編程5.隨日期變化:利用date進行文化的創(chuàng)建【例2】假設想要創(chuàng)建3個空的文件(通過touch),文件名開頭由用戶輸入決定,假設用戶輸入“filename”,而今天的日期是2022/08/15,若想要以前天、昨天、今天的日期來創(chuàng)建這些文件,即filename_20220813,filename_20220814,filename_20220815,該如何編寫程序?[root@testscripts]#vimsh03.sh#!/bin/bash#Program:#Programcreatesthreefiles,whichnamedbyuser'sinputanddatecommand.#History:#2022/08/13 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATH任務四shell編程#讓使用者輸入文件名稱,并取得fileuser這個變量echo-e"Iwilluse'touch'commandtocreate3files." #純粹顯示信息read-p"Pleaseinputyourfilename:"fileuser#提示用戶輸入

#為了避免用戶隨意按“Enter”鍵,利用變量功能分析文件名是否設置?filename=${fileuser:-"filename"} #開始判斷是否設置了文件名#開始利用date命令來取得所需要的文件名date1=$(date--date='2daysago'+%Y%m%d) #前兩天的日期,注意+號前面有個空格date2=$(date--date='1daysago'+%Y%m%d) #前一天的日期,注意+號前面有個空格date3=$(date+%Y%m%d) #今天的日期file1=${filename}${date1} #這三行設置文件名file2=${filename}${date2}file3=${filename}${date3}任務四shell編程#創(chuàng)建文件touch"$file1"touch"$file2"touch"$file3"[root@testscripts]#shsh03.sh[root@testscripts]#ll任務四shell編程6.數(shù)值運算:簡單的加減乘除可以使用declare來定義變量的類型,利用“$((計算式))”來進行數(shù)值運算。不過可惜的是,bashshell默認僅支持到整數(shù)?!纠?】要求用戶輸入兩個變量,然后將兩個變量的內(nèi)容相乘,最后輸出相乘的結(jié)果。[root@testscripts]#vimsh04.sh#!/bin/bash#Program:#Userinputs2integernumbers;programwillcrossthesetwonumbers.#History:#2022/08/15 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin任務四shell編程exportPATHecho-e"YouSHOULDinput2numbers,Iwillcrossthem!\n"read-p"firstnumber:"firstnuread-p"secondnumber:"secnutotal=$(($firstnu*$secnu))echo-e"\nTheresultof$firstnu╳$secnuis==>$total"[root@testscripts]#shsh04.sh任務四shell編程在數(shù)值的運算上,我們可以使用“declare-itotal=$firstnu*$secnu”,也可以使用上面的方式來表示。建議使用下面的方式進行運算:var=$((運算內(nèi)容))不但容易記憶,而且也比較方便。因為兩個小括號內(nèi)可以加上空白字符。至于數(shù)值運算上的處理,則有+、-、*、/、%等,其中%是取余數(shù)。[root@testscripts]#echo$((13%3))1任務四shell編程7.利用test命令的測試功能(1)test命令進行條件判斷當需要檢測系統(tǒng)上面某些文件或者是相關的屬性時,利用test命令是最好選擇。例如,要檢查/dmtsai是否存在:[root@test~]#test-e/etc運行結(jié)果并不會顯示任何信息??梢酝ㄟ^$?或&&及||來顯示整個結(jié)果:[root@test~]#test-e/etc&&echo"exist"||echo"Notexist"Notexist<==結(jié)果顯示不存在最終的結(jié)果告訴我們是“exist”還是“Notexist”。以上例子告訴我們,測試一個“文件或目錄”是否存在可以用-e實現(xiàn)。那么test還有哪些選項可用來判斷呢?任務四shell編程(2)test命令各選項的作用test命令各選項的作用見下表(表7.1-表7.6)。表7.1任務四shell編程表7.2任務四shell編程表7.3任務四shell編程表7.4任務四shell編程表7.5任務四shell編程表7.6任務四shell編程8.

test命令應用實例【例1】輸入一個文件名,然后作如下判斷。(1)這個文件是否存在,若不存在則給出“Filenamedoesnotexist”的信息,并中斷程序;(2)若這個文件存在,則判斷其是文件還是目錄,結(jié)果輸出“Filenameisregularfile”或“Filenameisdirectory”;(3)判斷一下,執(zhí)行者的身份對這個文件或目錄所擁有的權限,并輸出權限數(shù)據(jù)。任務四shell編程[root@testscripts]#vimsh05.sh#!/bin/bash#Program:Userinputafilename,programwillchecktheflowing:#1.)exist?2.)file/directory?3.)filepermissions#History:#2020/08/15 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATH

#讓使用者輸入文件名,并且判斷使用者是否輸入了字符串echo-e"Pleaseinputafilename,Iwillcheckthefilename'stypeand\permission.\n\n"read-p"Inputafilename:"filenametest-z$filename&&echo"YouMUSTinputafilename."&&exit0任務四shell編程#判斷文件是否存在,若不存在則顯示信息并結(jié)束腳本test!-e$filename&&echo"Thefilename'$filename'DONOTexist"&&exit0#開始判斷文件類型與屬性test-f$filename&&filetype="regularefile"test-d$filename&&filetype="directory"test-r$filename&&perm="readable"test-w$filename&&perm="$permwritable"test-x$filename&&perm="$permexecutable"#開始輸出信息echo"Thefilename:$filenameisa$filetype"echo"Andthepermissionsare:$perm"運行結(jié)果:[root@testscripts]#shsh05.sh任務四shell編程運行這個腳本后,會依據(jù)你輸入的文件名來進行檢查。先看是否存在,再看是文件還是目錄類型,最后判斷權限。但是必須要注意的是,由于root在很多權限的限制上面都是無效的,所以使用root運行這個腳本時,常常會發(fā)現(xiàn)與ls-l觀察到的結(jié)果并不相同。所以,建議使用一般用戶來運行這個腳本。不過你必須使用root的身份先將這個腳本轉(zhuǎn)移給用戶,否則一般用戶無法進入/root目錄。任務四shell編程9.判斷符號[]的應用除了使用test之外,其實,我們還可以利用判斷符號“[]”(就是中括號)來進行數(shù)據(jù)的判斷?!纠?】當運行一個程序的時候,這個程序會讓用戶選擇Y或N;如果用戶輸入Y或y時,就顯示“OK,continue”;如果用戶輸入n或N時,就顯示“Oh,interrupt!”;如果不是Y/y/N/n之內(nèi)的其他字符,就顯示“Idon'tknowwhatyourchoiceis”。【分析】該案例需要利用中括號、&&與||。任務四shell編程[root@testscripts]#vimsh06.sh#!/bin/bash#Program:#Thisprogramshowstheuser'schoice#History:#2022/08/15 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATHread-p"Pleaseinput(Y/N):"yn["$yn"=="Y"-o"$yn"=="y"]&&echo"OK,continue"&&exit0["$yn"=="N"-o"$yn"=="n"]&&echo"Oh,interrupt!"&&exit0echo"Idon'tknowwhatyourchoiceis"&&exit0運行結(jié)果:[root@testscripts]#shsh06.sh任務四shell編程10.利用if...thenif...then是最常見的條件判斷式。當符合某個條件判斷的時候,就進行某項工作。if...then的判斷還有多層次的情況,我們將分別介紹。(1)單層、簡單條件判斷式如果你只有一個判斷式要進行,那么:if[條件判斷式];then

當條件判斷式成立時,可以進行的命令工作內(nèi)容;fi<==將if反過來寫,就成為fi了,結(jié)束if之意如果有多個條件要判斷,除了sh06.sh那樣將多個條件寫入一個中括號內(nèi)之外,還可以用多個中括號來隔開。而括號與括號之間,則以&&(代表AND)或||(代表or)來隔開。任務四shell編程下面將sh06.sh這個腳本修改為if...then的樣式:[root@testscripts]#cpsh06.shsh06-2.sh[root@testscripts]#vimsh06-2.sh#!/bin/bash#Program:#Thisprogramshowstheuser'schoice#History:#2022/08/15 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATH

任務四shell編程read-p"Pleaseinput(Y/N):"ynif["$yn"=="Y"]||["$yn"=="y"];thenecho"OK,continue"exit0fiif["$yn"=="N"]||["$yn"=="n"];thenecho"Oh,interrupt!"exit0fiecho"Idon'tknowwhatyourchoiceis"&&exit0運行結(jié)果:[root@testscripts]#shsh06-2.sh任務四shell編程(2)多重、復雜條件判斷式在同一個數(shù)據(jù)的判斷中,如果該數(shù)據(jù)需要進行多種不同的判斷,那么應該怎么做呢?如sh06.sh腳本中,只進行一次$yn的判斷(僅進行一次if),不想做多次if的判斷。此時必須用到下面的語法:#一個條件判斷,分成功進行與失敗進行(else)if[條件判斷式];then

當條件判斷式成立時,可以進行的命令工作內(nèi)容;else

當條件判斷式不成立時,可以進行的命令工作內(nèi)容;fi任務四shell編程如果考慮更復雜的情況,則可以使用:#多個條件判斷(if...elif...elif...else)分多種不同情況運行if[條件判斷式一];then

當條件判斷式一成立時,可以進行的命令工作內(nèi)容;elif[條件判斷式二];then

當條件判斷式二成立時,可以進行的命令工作內(nèi)容;else

當條件判斷式一與二均不成立時,可以進行的命令工作內(nèi)容;fi【小貼士】elif也是個判斷式,因此出現(xiàn)elif后面都要接then來處理。但是else已經(jīng)是最后的沒有成立的結(jié)果了,所以else后面并沒有then。任務四shell編程將sh06-2.sh改寫成這樣:[root@testscripts]#cpsh06-2.shsh06-3.sh[root@testscripts]#vimsh06-3.sh#!/bin/bash#Program:#Thisprogramshowstheuser'schoice#History:#2022/08/15 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATH

任務四shell編程read-p"Pleaseinput(Y/N):"ynif["$yn"=="Y"]||["$yn"=="y"];thenecho"OK,continue"elif["$yn"=="N"]||["$yn"=="n"];thenecho"Oh,interrupt!"elseecho"Idon'tknowwhatyourchoiceis"&&exit0fi運行結(jié)果:[root@testscripts]#shsh06-3.sh此時,程序變得很簡單,而且依序判斷,可以避免重復判斷的狀況。任務四shell編程【例3】判斷$1是否為hello,如果是,顯示“Hello,howareyou?”;如果沒有加任何參數(shù),就提示用戶必須要使用的參數(shù);如果加入的參數(shù)不是hello,就提醒用戶僅能使用hello為參數(shù)。[root@testscripts]#vimsh07.sh#!/bin/bash#Program:#check$1isequalto“hello”#History:#2022/08/15 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATH任務四shell編程if["$1"=="hello"];thenecho"Hello,howareyou?"elif["$yn"==""];thenecho"Youmustinputparamenters,ex>{$0someword}"elseecho"Theonlyparamentersis‘hello’,ex>{$0hello}"fi運行結(jié)果:[root@testscripts]#shsh07.sh執(zhí)行該程序后,在$1的位置輸入hello,沒有輸入或隨意輸入,就可以看到不同的輸出。任務四shell編程11.利用case…in…esac判斷“if...then...fi”對于變量的判斷是以“比較”的方式來進行的,如果有多個既定的變量內(nèi)容,如sh07.sh當中,所需要的變量就是“hello”及空字符兩個,那么這時只要針對這兩個變量來設置情況就可以了。這時使用case...in...esac最為方便。任務四shell編程case$變量名稱in <==關鍵字為case,變量前有$符

"第一個變量內(nèi)容")<==每個變量內(nèi)容建議用雙引號括起來,關鍵字則為小括號)

程序段

;; <==每個類別結(jié)尾使用兩個連續(xù)的分號來處理

"第二個變量內(nèi)容")

程序段

;;*)<==最后一個變量內(nèi)容都會用*來代表所有其他值不包含第一個變量內(nèi)容與第二個變量內(nèi)容的其他程序運行段

exit1;;esac <==最終的case結(jié)尾!思考一下case反過來寫是什么【小貼士】該語法以case開頭,esac結(jié)尾,每一個變量內(nèi)容的程序段都需要兩個分號(;;)來結(jié)尾。任務四shell編程現(xiàn)將sh09.sh的案例進行修改:[root@testscripts]#vimsh07-2.sh#!/bin/bash#Program:#Show"Hello"from$1....byusingcase....esac#History:#2022/08/15 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATH任務四shell編程case$1in"hello")echo"Hello,howareyou?";;"")echo"Youmustinputparameters,ex>{$0someword}";;*)#其實就相當于通配符,0~無窮多個任意字符之意

echo"Usage$0{hello}";;esac任務四shell編程運行結(jié)果:[root@testscripts]#shsh07-2.shYoumustinputparameters,ex>{sh07-2.shsomeword}[root@testscripts]#shsh07-2.shsmileUsagesh07-2.sh{hello}[root@testscripts]#shsh07-2.shhelloHello,howareyou?如果你輸入“shsh07-2.shsmile”來運行,那么屏幕上就會出現(xiàn)“Usagesh09-7.sh{hello}”的字樣,告訴用戶僅能夠使用hello。這樣的方式對于需要某些固定字符作為變量內(nèi)容來執(zhí)行的程序就顯得更加方便。還有,系統(tǒng)的很多服務的啟動腳本都是使用這種寫法的。任務四shell編程12.whiledodone,untildodone(不定循環(huán))循環(huán)可以不停地運行某個程序段落,直到使用者配置的條件達成為止。循環(huán)可分為不定循環(huán)和固定循環(huán)。(1)whiledodonewhile[condition] <==中括號內(nèi)的狀態(tài)就是判斷式do <==do是循環(huán)的開始!程序段落done <==done是循環(huán)的結(jié)束。while的中文是“當....時”,所以,這種方式說的是“當condition條件成立時,就進行循環(huán),直到condition的條件不成立才停止”的意思。任務四shell編程【例4】假設要讓用戶輸入yes或者是YES才結(jié)束程序的運行,否則就一直運行并告訴用戶輸入字符。[root@testscripts]#vimsh08.sh#!/bin/bash#Program:#Repeatquestionuntiluserinputcorrectanswer.#History:#2022/08/15 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATHwhile["$yn"!="yes"-a"$yn"!="YES"]doread-p"Pleaseinputyes/YEStostopthisprogram:"yndoneecho"OK!youinputthecorrectanswer."任務四shell編程【例5】利用循環(huán),計算1+2+3+…+100的值。[root@testscripts]#vimsh09.sh#!/bin/bash#Program:#Uselooptocalculate"1+2+3+...+100"result.#History:#2022/08/15 Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATH任務四shell編程s=0 #這是累加的數(shù)值變量i=0 #這是累計的數(shù)值,即1,2,3...while["$i"!="100"]doi=$(($i+1)) #每次i都會添加1s=$(($s+$i)) #每次都會累加一次doneecho"Theresultof'1+2+3+...+100'is==>$s"運行結(jié)果:[root@testscripts]#shsh09.shTheresultof'1+2+3+...+100'is==>5050任務四shell編程(2)untildodoneuntil[condition]do

程序段落done這種方式恰恰與while相反,它說的是當condition條件成立時,就終止循環(huán),否則就持續(xù)運行循環(huán)的程序段。任務四shell編程如果使用until完成例4,則對sh08.sh修改如下:[root@testscripts]#vimsh08-2.sh#!/bin/bash#Program:#

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論