Linux程序設計-技術技巧與項目實踐-Shell基礎與編課件_第1頁
Linux程序設計-技術技巧與項目實踐-Shell基礎與編課件_第2頁
Linux程序設計-技術技巧與項目實踐-Shell基礎與編課件_第3頁
Linux程序設計-技術技巧與項目實踐-Shell基礎與編課件_第4頁
Linux程序設計-技術技巧與項目實踐-Shell基礎與編課件_第5頁
已閱讀5頁,還剩175頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第四章 Shell基礎與編程技術4.1SHELL概述4.2SHELL程序設計基礎 4.3SHELL基本命令 4.4SHELL變量 4.5SHELL程序流程 4.6程序調試4.7SHELL編程綜合范例 4.8實戰技巧系統資源查看與多命令執行12/21/20221第四章 Shell基礎與編程技術4.1SHELL概述12/4.1shell概述Shell是最基礎和實用的linux工具,熟練掌握shell技巧及其使用方法,是用好linux的關鍵。用戶對shell的熟練程度直接體現用戶的linux編程水平。本章先了解shell,進而掌握shell命令、變量和程序控制結構、程序調試,最后通過理解綜合范例,把握編程技巧,達到學以致用的目的。shell是一個工具程序,在用戶登錄后由系統啟動,解釋并運行由命令行或腳本文件輸入的命令,實現用戶與內核間的交互。Shell提供的變量、賦值語句、控制流等基本操作語句與高級語言中的函數調用極為相似,除了關鍵字與語法規則不同外,還有兩點不同。一是參數可以為任意字符串,多數情況下字符串不用引號;二是參數表不用括號,各參數之間也不用逗號分隔。12/21/202224.1shell概述Shell是最基礎和實用的linux工Linux系統提供了多種不同的shell。常用的有Bourneshell(簡稱sh)、C-shelll(簡稱csh)、Kornshell(簡稱ksh)和BourneAgainshell(簡稱bash)。它們的淵源和區別,請讀者自己到網上遨游一下,便略知一二。目前linux系統的缺省shell分別是BourneAgainshell,即bash。要知道所用的linux有哪些版本的shell,可以查看/etc/shell目錄下的文件。查看命令行如下:$cat/etc/shells還可以用下面的命令來查看當前的shell類型:#echo$SHELL其中的“$SHELL”是環境變量,記錄使用的shell型。可以用$exit命令退出當前shell。12/21/20223Linux系統提供了多種不同的shell。常用的有Bourn4.2shell程序設計基礎shell擅長系統管理,shell腳本實質是命令批處理。復雜腳本一般包括判斷、循環、文件測試等程序結構。這時應對linux工具集有一些理解。工具grep、sed和awk等,在處理命令輸出和文件時功能很強大。建立shell腳本的步驟同建立文本文件相同。用vi等進行程序錄入和編輯,也可以用cat和管道等命令直接建立一個腳本文件。【例】4.1建立一個shell腳本,在提示符后輸入顯示和重定向命令:$cat>myprogram回車后直接輸入命令,再回車并輸入命令,如下所示:#!/bin/sh#filename:myprogramx=”helloworld.”echo$xy=”myfirstshellprogram.”echo$yexit完成編輯按住Ctrl+Z退出,則myprogram的shell腳本程序就完成了,返回shell命令狀態。12/21/202244.2shell程序設計基礎shell擅長系統管理,she12/21/2022512/18/20225同其他語言一樣,也可以通過使用任意一種文字編輯器,比如nedit、kedit、emacs、vi等來編寫shell程序。程序最好以“#!/bin/sh”為開始的第一行。符號#!用來告訴系統它后面的參數是用來執行該文件的程序。在這個例子中使用/bin/sh來執行程序。當腳本編好后,要執行該腳本還要改變其文件為可執行文件屬性。但在cygwin的linux模擬環境中可以直接執行而無需改變其文件屬性。改變腳本文件成為可執行文件屬性的命令行的寫法是:$chmod+xmyprogram或$chmod755myprogram最后,執行該程序的命令行寫法是:$./myprogram或$bashmyprogram回車就可以看到程序的執行結果:helloworld.myfirstshellprogram.12/21/20226同其他語言一樣,也可以通過使用任意一種文字編輯器,比如ned在shell編程時,以#開頭的句子表示這一行為注釋。Shell對用戶輸入的命令即文件名進行分析。如果文件標記為可執行,但不是編譯過的程序,shell把它看作shell腳本,并解釋執行。用戶開發的shell腳本可以駐留在命令搜索路徑的目錄之下如/bin、/usr/bin等,像普通命令一樣使用。通過這樣方式可以擴充新命令。shell腳本經常被用來執行重復性的工作。當進入系統時要查看有無信件、現有用戶群、將工作目錄改為指定目錄、顯示當前日期等。完成這些工作的命令是固定的,可把它們寫入一個shell腳本中,每次批處理完成。有些固定工作的命令很復雜,如文件系統安裝mount帶多個選項和參數,此時用shell腳本存放該命令,就能提高效率。shell的基本功能有運行程序、輸入輸出重定向、變量和文件名的替換、管道、編程與環境的控制等。RedHatLinux帶有不少快捷方式。'~'就是home目錄的簡寫形式。如想把一個名為‘sometext’的文件復制到home目錄下的‘docs’子目錄中,可以用#cpsometext~/docs實現。另外,$cd回車可隨時回到home目錄。12/21/20227在shell編程時,以#開頭的句子表示這一行為注釋。12/1(1)bash配置文件在用戶的home目錄下,運行命令:$ls.bash*將會看到這些文件:.bash_history:記錄了用戶以前輸入的命令。.bash_logout:當用戶退出shell時,要執行的命令。.bash_profile:當用戶登入shell時,要執行的命令。.bashrc:每次打開新的shell時,要執行的命令。其中.bash_profile只在會話開始時讀取一次,而.bashrc每次打開新終端時都被讀一次。.bash_profile經常設置先讀.bashrc文件,用戶能把所有配置都放進.bashrc里。這些是用戶個人設置,系統級設置在'/etc/profile'、'/etc/bashrc'及目錄'/etc/profile.d'下的文件里。當系統與用戶設置發生沖突時,用戶設置有效。12/21/20228(1)bash配置文件在用戶的home目錄下,運行命令:1(2)提示符每打開一個控制臺console或xterm時,先看到提示符。默認提示符將顯示用戶名、主機名(默認localhost)、當前目錄(‘~’表示home目錄),最后一個字符是普通用戶($)或是‘root’(#)的標記。用戶通過$PS1設置提示符。命令:echo$PS1將顯示當前的設定。默認設定提示符顯示的只是當前目錄的最后部分。可以用pwd(輸出當前目錄,printworkingdirectory)查看細節。怎樣讓shell自動告訴用戶的當前目錄呢?提示符等信息一般包含在文件'/etc/bashrc'中,用戶可以通過編輯各自home目錄下的'.bash_profile'和'.bashrc'來改變設置。在manbash中的'PROMPTING'部分,對這些參數有詳細說明。用戶可以自行設置內容如時間、命令歷史記錄號或不同顏色等。在'~/.bashrc'中,用戶比較清晰的設定是:PS1="\[\033[1m\][\w]\[\033[0m\]"'root'在'~/.bashrc'中的設定是:PS1="\[\033[0;31m\][\w]\[\033[0m\]"這時用戶得到的提示符是:[/usr/bin]當用'root'時,變成:[/usr/bin]用戶已去掉了主機名和用戶名。普通用戶提示符可以是黑底白字或白底黑字。12/21/20229(2)提示符每打開一個控制臺console或xterm時,先(3)改變$PATH'$PATH'與'$PS1'都是環境變量。輸入set將列出所有當前定義的環境變量。用戶看到的環境變量在shell配置文件中的定義,可能是用戶自己的配置文件,也可能是由root通過'/etc'下面的系統級文件定義的。如果用戶使用X,更多的變量將由X和用戶窗口管理器或桌面環境的啟動文件配置。了解如何改變$PATH變量很有用,它決定了shell尋找命令或程序的目錄路徑。若要執行命令的目錄在$PATH中,用戶就不必輸入這個命令的完整路徑,能夠直接執行。第三方軟件一般沒有把可執行文件放到標準目錄中,需要添加到$PATH中,才能保證程序的正常運行。用戶如何處理一般的環境變量是有技巧的。所有環境變量名都大寫,用戶也可以自定義一些非大寫的變量,如'$path'、'$pAtH',但shell不知道這些變量。變量名有時以'$'開頭,有時不是。當設置一個變量時,用戶直接用名稱而不需要加'$',但要獲取變量的值就要在變量名前加'$':$echo$PATH$/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin否則命令行$echoPATH的執行結果就是:$PATH。12/21/202210(3)改變$PATH'$PATH'與'$PS1'都是環境變處理$PATH變量時,用戶不能只替換變量,而要將新字符串添加到原來的值中。用戶不能用'PATH=/some/directory',這將刪除$PATH中的其它所有目錄。用戶在該終端運行程序時,必須給出完整路徑。所以只能添加:PATH=$PATH:/some/directory當用戶打開新終端運行echo$PATH時,返回的是舊$PATH值,看不到添加的新目錄。因為用戶定義的是局部環境變量。要定義全局變量,用戶需要將局部變量輸出(export),用export命令:exportPATH=$PATH:/some/directory現在打開新終端,輸入echo$PATH,將能看到新設置的$PATH。為了永久保存添加的路徑,要將'export'行添加到用戶'.bash_profile'文件。不要在'.bashrc'中設置PATH,以免PATH目錄意外增長。因為用戶每打開一個終端,目錄都會被添加,從而導致PATH變量目錄的多次復制。(4)歷時記憶功能bash命令的歷史功能是把以往輸入的命令記錄下來,方便日后查詢與再次使用。只要按向上鍵就能調出歷史命令。與SHIFT鍵連用,可遍歷該控制臺中的歷史輸出。歷史命令的編輯修改通過光標和Home、End等鍵完成。用戶可以為環境變量HISTFILE賦新值改變存放歷史命令的文件,如:$HISTFILE="/home/mengqc/.myhistory"12/21/202211處理$PATH變量時,用戶不能只替換變量,而要將新字符串添加4.3shell基本命令Linux中的shell命令很多,第三章已進行了解析,這里把與編程有關的命令羅列出來,便于讀者掌握。這些命令分為內部命令和外部命令兩類。4.3.1內部命令shell內部命令是shell本身具備的基本命令,執行速度比外部命令快,存放在內存中,在當前shell中立即被執行,不必創建新進程。編寫shell程序時盡量使用內部命令,以提高程序的執行效率。不同shell的內部命令大同小異,差別在于命令名或語法,用戶只要熟悉一種shell就可以了。表4.2以bash為例列出常用的內部命令。12/21/2022124.3shell基本命令12/18/20221212/21/20221312/18/2022134.3.2外部命令shell除去內部命令以外的命令被稱為外部命令或程序。常用的有mv、ls、cp等。用戶在執行外部命令時,shell首先查詢路徑找到該命令,然后生成子shell,由它解釋執行這條命令。在命令執行過程中,原shell(父shell)等待子shell的執行而進入睡眠態,一旦子shell執行完畢,子shell將喚醒原shell,而子shell的生命周期到此結束。4.3.3命令分組在shell中有兩種命令分組的方法:“()”和“{}”。當shell執行()中的命令時將再創建一個新的子進程,然后這個子進程執行圓括弧中的命令。當用戶在執行某個命令時,若不想讓命令運行對狀態集合的改變,影響后面語句的執行時,就該把這些命令放在括弧中,這樣就能保證所有的改變只對子進程產生影響,而父進程不受干擾。{}用于將順序執行的命令輸出結果用于另一個命令的輸入(管道方式)。當用戶使用圓括弧和花括弧時,需要在其前面加上轉義符(、)以便shell知道他們不是用于命令執行的終止之用。12/21/2022144.3.2外部命令shell除去內部命令以外的命令被稱為外4.3.4函數bash函數的實質是命令集合或批處理文件。在shell中定義的函數都是由若干條shell命令組成的命令集合體,與shell程序形式相似,可看作一條復合命令。不同之處在于它是多進程。函數定義的基本格式為:[function]函數名(){若干命令行}其中關鍵字function可以缺省。調用函數的格式為:函數名參數1參數2...shell函數可以完成一些例行工作,可以有自己的退出狀態,所以函數可以作為if、while等控制結構的條件。在函數定義時一般不帶參數,而在調用函數時帶參數運行,shell此時把參數分別賦予相應的位置參數$1、$2、....及$*。函數的規則是先定義后使用。調用函數時直接利用函數名,不帶圓括號,與一般命令同樣使用。shell腳本與函數間的參數傳遞可用位置參數和變量直接傳遞。變量值可以由shell腳本傳遞給被調用函數,而函數中所用的位置參數$1、$2等對應于函數調用語句中的實參,這與普通命令不同。12/21/2022154.3.4函數bash函數的實質是命令集合或批處理文件。在【例】4.2#funcisafunctionname#itechosthevaluesofvariablesandargumentsfunc(){echo"Let'sbeginnow."echo$a$b$cecho$1$2$3echo"Theend."}a="Workingdirectory"b="is"c=`pwd`funcWelcomeYouBybyecho"Todayis`date`"shell中的函數把若干命令集合在一起,通過函數名調用。如果需要還可被多次調用。執行函數并不創建新的進程,是通過shell進程執行的。通常函數的最后一個命令執行后就退出被調函數。可以用return命令立即退出函數,其語法格式是:return[n]其中的n值是退出函數時的退出值(退出狀態),即$?的值。當n值缺省時,則退出值是最后一個命令執行后的退回值。12/21/202216【例】4.2#funcisafunction【例】4.3定義4個函數并實現其功能upper()函數:將傳遞給它的文件中的字母轉換成大寫,并存放到同名的結尾為.out的文件中。lower()函數:將傳遞給它的文件里的字母轉換成小寫,并存放到同名的結尾為.out的文件中。print()函數:輸出傳遞給它的文件的內容。usage_error()函數:輸出程序的幫助信息。程序的主模塊是case條件語句,根據命令行中第一個參數決定程序完成什么功能,并調用相應函數完成這個功能。

12/21/202217【例】4.3定義4個函數并實現其功能upper()函數4.3.5shell的命令組合Linux系統可以把系統命令、應用程序和用戶程序有機地組合起來完成一系列任務。shell通過管道、輸入輸出重定向以及程序設計的方法來實現這一功能。通過這些方法,用戶可以靈活高效地使用shell控制linux系統的各種資源。管道是把一個應用程序的標準輸出與另外一個應用程序的標準輸入相連接的有效工具。管道的基本格式為:[應用程序][管道操作符][應用程序]管道操作符是一個代表管道的專用字符“|”。管道線是由管道操作符分隔的幾個應用程序組成的序列。管道線實現了創建管道文件并重定向輸入輸出的功能。管道重定向與I/O重定向不同,前者直接把一個程序的輸出與另一個程序的輸入相連,不創建任何中間文件。Linux系統的一串管道線是一個命令表,送回的值是該命令表中最后一個管道線的出口狀態。命令表中分隔命令的符號有“;”或換行符。&&表示條件為真(true)時執行其后面的管道線。“||”表示條件為假(false)時才執行后面的管道線。&表示前面的管道線在后臺執行。12/21/2022184.3.5shell的命令組合12/18/202218通過命令、管道線和命令表,用戶可以完成各種從簡單到復雜的任務。輸入輸出重定向主要有以下幾種用法:在標準管道重定向中,“<”為輸入重定向,“>”為輸出重定向,“>>”為追加輸出重定向。如“應用程序2>文件”或“應用程序2>>文件”則將應用程序產生的寫文件和標準錯誤輸出的全部信息一起寫入文件。使用>&進行標準輸出的重定向。如:“應用程序>&2”命令就是把應用程序的輸出重定向到標準錯誤輸出中。當系統執行shell命令時,會自動打開3個文件:標準輸入(文件描述字為0),標準輸出(文件描述字為1),標準錯誤輸出(文件描述字為2)。系統初始化時,將這3個文件連接到相應的終端,0對應鍵盤,1對應屏幕,2對應屏幕。如果用戶鍵入了一個命令,系統就會自動執行該命令,并將結果送到屏幕上。如果用戶輸入的是錯誤命令,系統會自動將出錯信息送到標準錯誤輸出即屏幕上。12/21/202219通過命令、管道線和命令表,用戶可以完成各種從簡單到復雜的任務4.3.6shell特殊字符shell中的特殊字符,都有特定的含義,如通配符“*”和“?”、管道線“|”、單引號和雙引號等。在使用時應注意它們表示的意義和作用范圍。1.一般通配符通配符用于模式匹配,如文件名匹配、路徑名搜索、字符串查找等。常用的通配符有四種:“*”匹配任意字符0或多次。如f*可以匹配以f開頭的任意字符串。“?”匹配任意一個字符,如f?匹配f1、fa等,但不匹配f、fabc等。“]”匹配該字符組限定的任何一個字符。如f[a-d]與f[abcd]作用相同。“!”表示不在一對方括號中列出的字符。如f[!1-9].c表示以f開頭,后面一個字符不是數字1至9的.c文件名,它匹配fa.c、fb.c等。在一個正則表達式中,可以同時使用“*”和“?”。12/21/2022204.3.6shell特殊字符12/18/2022202.模式表達式模式表達式是包含一個或多個通配符的字符序列。其形式和含義如下:*(模式表)匹配給定模式表中“模式”的0或多次出現,各模式之間以“|”分開。例如,file*(.c|.o)將匹配文件file、file.c、file.o、file.c.c、file.o.o、file.c.o、file.o.c等,但不匹配file.h或file.s等。+(模式表)匹配給定模式表中“模式”的1次或多次出現,各模式之間以“|”分開。例如,file+(.c|.o)匹配文件file.c、file.c.o等,但不匹配file。?(模式表)匹配模式表中任何一種“模式”的0或1次出現,各模式之間以“|”分開。例如file?(.c|.o)只匹配file、file.c和file.o,不匹配file.c.o等。@(模式表)僅匹配模式表中給定“模式”的一次出現。!(模式表)除給定模式表中一個“模式”外,它可匹配其它任何東西。可以看出,模式表達式的定義是遞歸的,每個表達式中都可以包含一個或多個模式。例如file*(.[cho]|.sh)是合法的模式表達式。12/21/2022212.模式表達式模式表達式是包含一個或多個通配符的字符序列。3.引號在shell中引號分為三種:單引號、雙引號和倒引號。雙引號中的字符,除$、倒引號(`)和反斜線(\)仍保留其特殊功能外,其余字符均作為普通字符對待。“$”表示變量替換,即用其后指定的變量的值來代替$和變量;倒引號表示命令替換;僅當“\”后面的字符是下述字符之一時,“\”才是轉義字符,這些字符是:“$”、“`”、“"”、“\”或換行符。轉義字符告訴shell不對其后面的字符進行特殊處理,只當普通字符。如:$echo"Mycurrentdiris`pwd`andlognameis$LOGNAME"Mycurrentdiris/home/mengqcandlognameismengqc單引號中的字符都作為普通字符出現。例如,$echo'Thetimeis`date`,thefileis$HOME/abc'Thetimeis`date`,thefileis$HOME/abc倒引號中的字符串被shell解釋為命令行。執行時先執行該命令行,并以它的標準輸出結果取代整個倒引號部分。在前面示例中已見過。例如,$echocurrentdirectoryis`pwd`currentdirectoryis/home/mengqc注釋:shell程序中以“#”開頭的正文行都表示注釋。注釋行用來說明程序的功能、結構、算法和變量等,增加程序可讀性。在執行時注釋行被忽略。12/21/2022223.引號在shell中引號分為三種:單引號、雙引號和倒引4.4shell變量shell用變量存放字符串,變量沒有存儲類型,使用時直接定義并賦值。shell有環境變量和臨時變量之分。環境變量是永久性變量,其值不會隨shell腳本執行結束而消失。臨時變量是在shell程序內部定義的,使用范圍僅限于程序內部,程序執行結束就隨之消失了。Bash作為常用的shell,其變量和C變量有區別,值得注意的問題有:Bash變量在引用時要在變量前加"$"符。第一次賦值及在for循環頭部不用加"$"符號;Bash中沒有浮點型變量,也沒有浮點運算;Bash整形變量的算術運算要經過let或expr語句處理。在變量賦值時,“=”左右兩邊都不能有空格,Bash語句的結尾不加分號";"。在變量之間的比較操作上,整數變量和字符串變量各不相同。判斷整數a和b是否相等就寫做if[$a=$b],判斷整數a是否大于整數b就寫做if[$a-gt$b]。比較字符串a和b是否相等就寫作:if[$a=$b],判斷字符串a是否為空就寫作:if[-z$a]。判斷整數變量a是否大于b就寫作:if[$a-gt$b]。注意在“[”和“]”符號的左右側必須留有空格。如if[-x/root]可用來判斷當前用戶是否可以進入/root目錄。12/21/2022234.4shell變量shell用變量存放字符串,變量沒有存4.4.1用戶自定義變量變量和shell是緊密相關的,bash有兩個基本的系統配置文件:/etc/bashrc和/etc/profile。它們包含兩組不同的變量:shell變量和環境變量。前者只在特定shell中固定(如bash),后者可在不同shell中固定。顯然,shell變量是局部的,而環境變量是全局的。環境變量通過shell命令設置,設置好的環境變量又可以被所有當前用戶運行的程序使用。對于bash可以通過變量名來訪問相應的環境變量,通過export來設置環境變量。用戶定義的變量是最普通的shell變量。變量名以字母或下劃線開頭的字母、數字和下劃線序列,且大小寫字母意義不同。如dir與Dir是不同變量。這與C語言中標識符的定義相同。變量名的長度不受限制。定義變量并賦值的一般形式是:變量名=字符串例如:myfile=/usr/meng/ff/m1.c12/21/2022244.4.1用戶自定義變量變量和shell是緊密相關的,ba變量值的改變,只須利用賦值語句重新賦值。未賦值的變量僅含一個空串。在程序中使用變量值,要在變量名前面加上一個符號“$”。例如,$dir=/usr/meng/ff則命令行$echo$dir的顯示結果為:/usr/meng/ff如果在賦值變量中包含空格、制表符或換行符,那么就應該用雙引號把這個字符串括起來。例如:names="ZhangsanLisiWangwu"可以將一個命令的執行結果賦值給變量。有兩種替換方式:使用倒引號或小括號引用命令。例如:將當前工作目錄的全路徑名存放到變量dir中,可以輸入以下命令行:$dir=`pwd`或$dir=$(pwd)一個變量可以是字符串,或再定義為整數。如果對該變量進行整數運算,就可以被解釋為整數;如果進行字符串操作,它就被看作為字符串。12/21/202225變量值的改變,只須利用賦值語句重新賦值。未賦值的變量僅含一個【例】4.4關鍵字let的應用#!/bin/bashx=2006let"x=$x+1"echo$xx="astring."echo$x關于整數變量計算,有如下幾種:"+-*/%",它們的意思和字面意思相同,在*和/之前必須冠以反斜線,以免被SHELL先行解釋。整數運算一般通過let和expr指令來實現,如對變量x加1可以寫作:let"x=$x+1"或者x=`expr$x+1`。$#傳入腳本的命令行參數個數;$*所有命令行參數值,在各個參數值之間留有空格;12/21/202226【例】4.4關鍵字let的應用#!/bin/bash12/為了使某個變量存在于一個局部程序塊中,引入了局部變量的概念。Bash變量首次被賦初值時加上local關鍵字就可以聲明為局部變量,如:#!/bin/bashHELLO="var1"echo$HELLOfunctionhello{localHELLO="var2"echo$HELLO}echo$HELLO該程序的執行結果是:var1var2var1這個執行結果表明全局變量$HELLO的值在執行函數hello時并沒有改變,表明局部變量$HELLO的作用域在于函數的程序塊中。12/21/202227為了使某個變量存在于一個局部程序塊中,引入了局部變量的概念。4.4.2變量的類型聲明Bash中變量的類型聲明一般用關鍵詞declare,其語法格式為:declare[+/-][rxia][變量名稱=設置值]其所帶的參數含義是:[-/+]a設置/撤消變量的數組屬性;[-/+]i設置/撤消變量的整數屬性,但變量可以是數值,字符串或運算式;[-/+]r設置/撤消變量的只讀屬性;[-/+]x設置/撤消變量輸出屬性,指定變量為環境變量供shell外程序使用;-p顯示變量屬性;-f定義函數或僅顯示函數。在前5個選項中用來聲明變量并設置變量的屬性([rixa]即為變量的屬性),在第6個選項中用來顯示shell函數。若不加上參數,則顯示全部的shell變量與函數(與執行set指令的效果相同)。參數"-"用來指定變量的屬性,"+"則取消變量所設的屬性。#!/bin/bashdeclare-ia=2declare-ib=3declare-ic=$a+$becho$c這樣出來的結果才能是5。12/21/2022284.4.2變量的類型聲明Bash中變量的類型聲明一般用關鍵4.4.3數組變量bash只提供一維數組,數組的大小沒有限定。和C類似,數組元素下標由0開始。獲取數組中的元素要利用下標。下標是整數或算術表達式,值>=0。可用賦值語句對數組賦值。形式是:數組名[下標]=值。【例】4.5$city[0]=Beijingor$city[1]=Shanghai用declare顯式聲明數組形式是:declare-a數組名讀取數組元素值的一般格式是:${數組名[下標]}【例】4.6$echo${city[0]}Beijing數組元素可單獨逐個賦值或組合賦值。形式是:數組名=(值1值2...值n);其中各個值之間以空格分開。如:$A=(thisisanshellexamplescript)$echo${A[*]}則顯示的結果為:$thisisanshellexamplescript$echo${A[6]}由于數組初值有6個,所以A元素個數是6。A[6]超出了數組A范圍,被認為是新元素,由于沒有賦值,所以是空串。數組名表示下標為0的數組元素,如city就等價于city[0]。使用*或@做下標,則會以數組中所有元素取代[*]或[@]。12/21/2022294.4.3數組變量bash只提供一維數組,數組的大小沒有限4.4.4變量的引用在bash中,有效的變量引用表達式有以下幾種形式:$name ${name#pattern}${name} ${name##pattern}${name[n]} ${name%pattern}${name[*]} ${name%%pattern}${name[@]} ${#@}${name:-word} ${$#*}${name:=word} ${#name}${name:?word} ${#name[*]}${name:+word} ${#name[@]}12/21/2022304.4.4變量的引用在bash中,有效的變量引用表達式有以這些不同形式的意義解釋表達式$name表示變量name的值,若未定義,則用空值替換。表達式${name}將被變量name的值替換。用花括號括起name,是把變量名與后面字符分隔開,避免混淆。替換后花括號被取消。${name[n]}表示數組變量name中第n個元素的值。表達式${name[*]}和${name[@]}都表示數組name中所有非空元素值,用空格分開。用雙引號括起來時,"${name[*]}"被擴展成字符串,各數組元素以空格分開;而"${name[@]}"被擴展成多個詞,每個數組元素是一個詞。如果數組name中沒有元素,則${name[@]}被擴展為空串。表達式${name#pattern}和${name##pattern},如果pattern(表示匹配模式)與name值的開頭匹配,那么name的值去掉匹配部分后的結果就是該表達式的值;否則,name的值就是該表達式的值。在第一種格式中,name值去掉的部分是與pattern匹配的最少的部分;而第二種格式中,name值去掉的部分是與pattern匹配的最多的部分。表達式${name%pattern}和${name%%pattern},如果pattern與name值的末尾匹配,那么name的值中去掉匹配部分后的結果就是該表達式的值;否則,該表達式的值就是name的值。在第一種格式中,去掉的部分是最少的匹配部分;而第二種格式中,去掉的部分是最多的匹配部分。表達式${#@}和${#*}的值分別是由$@和$*返回的參數的個數。表達式${#name[i]}的值是數組name第i個元素值的長度。表達式${#name[*]}和${#name[@]}的值都是數組name的元素個數。12/21/202231這些不同形式的意義解釋表達式$name表示變量name的值,4.4.5鍵盤輸入變量利用read命令可從鍵盤讀數據賦給指定變量。read命令的一般格式是:read變量1[變量2…]。例如:readabc輸入數據時,數據間以空格或制表符分隔。如果變量個數與給定數據個數相同,則依次對應賦值;如果變量個數少于數據個數,則從左至右對應賦值,但最后一個變量被賦予剩余的所有數據;如果變量個數多于給定數據個數,則依次對應賦值,而沒有數據與之對應的變量取空串。12/21/2022324.4.5鍵盤輸入變量12/18/2022324.4.6位置變量在執行linux命令或shell腳本時可以用實參替代位置變量,它們的名稱很特別,分別是0、1、2……9。因為它們與命令行上具體位置的實參相對應:命令名(文件名)對應位置變量0,第一個實參對應位置變量1,第二個實參對應位置變量2……如果位置變量是由兩個或更多個數字構成,必須把它們用一對花括號括起來,如{10}、{11}。命令行實參與腳本中位置變量的對應關系如下:commc1c2c3c4……c10c11……$0$1$2$3$4……${10}${11}……【例】4.7$set`pwd;ls;date`$echo$1$2$3$9${10}${11}/home/mengqcbash_1ex112321:52:32在cygwin中的應用情況見圖4.1所示。12/21/2022334.4.6位置變量在執行linux命令或shell腳本時可如果在腳本中使用的位置參數不超過9個,那么只用$1~$9即可。但是,實際給定的命令行參數有可能超過9個,此時就要用shift命令移動位置參數。每執行一次shift命令,就把命令行上的實參向左移一位,即相當于位置參數向右移動一個位置,如表4.3所示。表4.3位置變量的shift對應關系命令行Ex7ABCDEF原位置參數$0$1$2$3$4$5$6新位置參數$0$1$2$3$4$5表4.3列出了實參與位置參數的對應關系。可以看出,shift命令執行后新$1的值是原$2的值,新$2的值是原$3的值,依此類推。shift命令不能將$0移走,所以經shift右移后,$0的值不會變化,見圖4.2所示。12/21/202234如果在腳本中使用的位置參數不超過9個,那么只用$1~$9即可4.4.7預定義特殊變量shell中預定義的特殊含義的shell變量值只能由shell根據實際情況賦值,不能通過用戶重新設置。下面給出這些特殊變量的表示形式及意義。$#命令行上實際參數的個數,不包含shell文件名。$?上一條命令執行后的返回值(也稱為“退出碼”),是一個十進制數。多數shell命令執行成功時,返回值為0;執行失敗則返回非0值。圖4.2shift右移位置參數的變化情況$$當前進程的進程號。$!上一個后臺命令對應的進程號,是由1~5位數字構成的數字串。$-由當前shell設置的執行標志名組成的字符串。例如:

set-xv這個命令行給shell設置了標志-x和-v(用于跟蹤輸出)。$*表示命令行中實際給出的所有實參字符串,不限于9個實參。$@它與$*基本功能相同,但“$@”與“$*”不同。$0:保存程序名。12/21/2022354.4.7預定義特殊變量shell中預定義的特殊含義的sh4.4.8環境變量與置換變量PWD是指用戶當前目錄的全名 PPID是指父進程ID$是指當前進程ID UID是指當前用戶的UserIDPATH是指查找命令的目錄列表。PATH變量含帶冒號符的字符串。USER是指用戶賬號 MAIL是指系統信箱的路徑。TERM是指終端類型。 LOGNAME是用戶登錄名SECONDS是指當前運行的bash進程的運行時間(以秒為單位)HOME是指用戶home目錄的路徑名,是cd命令的默認參數COLUMNS是指定義了命令編輯模式下可使用命令行的長度EDITOR是指默認的行編輯器 IFS是定義SHELL使用的分隔符TMOUTSHELL指自動退出時間(秒),設為0禁止SHELL自動退出PS1是指主命令提示符 PS2指二級命令提示符,要求輸入數據時用PS3是select的命令提示符 PS4是指調試命令提示符LD_LIBRARY_PATH是指尋找庫的路徑,以冒號分隔。參數置換變量的一般形式是:變量2=${變量1op字符串}其中op表示操作符,它可以是下列四個操作符之一“::-”、“:=”、“:+”和“:?”。變量2的值取決于變量1(參數)是否為空串、用什么操作符及字符串的取值。在操作符的前后不要留空格。12/21/2022364.4.8環境變量與置換變量PWD是指用戶當前目錄的全名4.4.9算術運算bash中的整數算術運算命令是let,其語法格式為:letarg…其中arg是單獨的算術表達式,使用的是C語言中表達式的語法、優先級和結合性。除++、--和逗號(,)之外,所有整型運算符都能支持。提供方冪運算符“**”。命名的參數可以在算術表達式中直接利用名稱訪問,前面不帶“$”符號。當訪問命名參數時,就作為算術表達式計算它的值。算術表達式按長整數進行求值,不檢查溢出。但用0作除數就會產生錯誤。let命令的替代表示形式是:((算術表達式))例如,let″j=i*6+2″等價于((j=i*6+2))。如果表達式的值是非0,那么返回狀態值0;否則返回狀態值1。當表達式中有shell的特殊字符時,必須用雙引號將其括起來。【例】如,let″val=a|b″。如果不括起來,shell會把命令行letval=a|b中的“|”看成管道符,將其左右兩邊看成不同的命令,因而無法正確計算表達式的值。12/21/2022374.4.9算術運算bash中的整數算術運算命令是let,其4.5shell程序流程shell具有一般高級程序設計語言所具有的控制結構等復雜功能,如if語句、case語句、循環結構和函數等。4.5.1測試語句test條件測試有三種常用形式:一是test命令,二是一對方括號,這兩種形式是完全等價的。三是兩對方括號,即[[條件表達式]]。test命令可以和多種系統運算符一起使用,這些運算符可以分為四類:文件屬性及權限測試運算符、字符串測試運算符、數值測試運算符和邏輯運算符。與傳統語言不同,shell用于指定條件值的不是布爾表達式而是命令和字符串。12/21/2022384.5shell程序流程shell具有一般高級程序設計語言test測試命令用法Test命令用于檢查某個條件是否成立,它可以進行數值、字符和文件三個方面的測試,其測試符和相應的功能分別如表4.4所示。test可以對字符串、整數和文件進行條件測試。Linux還提供了與(“!”)、或(“-o”)、非(“a”)三個邏輯操作符用于將測試條件連接起來,其優先級為:“!”最高,“-a”次之,“-o”最低。test命令的格式為:testexpression 或者 [expression]其中的expression是被測試的條件。若testexpression或者[expression]的結果為真,則返回0,否則非0。注意expression和[]之間必須有空格。12/21/202239test測試命令用法Test命令用于檢查某個條件是否成立,它字符串比較字符串比較可以測試字符串長度是否為0以及兩個字符串是否相等。下面用例子來說明對字符串進行測試的方法。【例】4.8判斷兩個字符串是否相同。$test‘long’=‘long’;echo$?0$test‘long’=‘short’;echo$?1值得注意的是在“=”號兩邊一定要有空格,否則就會產生賦值歧義。使用test測試字符串時要注意的問題:向test傳遞的各自變量間必須有空白符,如果“=”與任一自變量之間沒有空白字符就會產生錯誤。在用變量值替換的自變量上,必須用雙引號括起來,以保證test在變量的值為空時也能接收到該自變量,這是一種良好的shell程序設計風格。12/21/202240字符串比較字符串比較可以測試字符串長度是否為0以及兩個字符串數字比較test命令可以用來比較整數。基本語法是:testint1opint2或者[int1opint2]其中int1和int2可以是任何正整數或負整數。【例】4.9$x1=”005”$x2=”10”$test“$x1”=5$echo$?1【例】4.10把005,5當作字符串來看待。當使用整數比較操作符時,把005,5當作整數來看待,整數的005和5是相等的。12/21/202241數字比較12/18/202241文件測試文件測試表達式測試一個文件是否滿足特殊條件,其通用語法是:testoptionname或者[optionname]其中name是文件的名字或目錄的名字,option和測試的結果如下所示:【例】4.11檢查指定的name是否為目錄$test–d/home$echo$?0當一個shell命令或程序執行成功時,返回0;如果執行失敗,則返回非0。除了一般命令的出口狀態外,Linux系統還提供了true和false兩個命令。true的返回值為0,而false的返回值為非0。shell可使用true和false作為恒真和恒假條件使用,用命令可以查看這兩個命令的返回值。如果命令行是由幾個應用程序和管道操作符組成的命令表,則整個命令行的返回值是該命令表中的最后一個應用程序的返回值。命令行的屬性值12/21/202242文件測試文件測試表達式測試一個文件是否滿足特殊條件,其通用語4.5.2條件語句if條件語句是最簡單最基本的控制結構。根據對條件的判斷來決定執行哪一組命令。這種語句的語法格式為:if表達式then命令表fi該語句先執行表達式,如果表達式為真,則執行命令表,否則退出if語句。如果用戶希望在表達式返回的值為假時,不退出if而轉去執行其他命令表,可以使用if語句的完整結構,如下所示:if表達式then命令表1else命令表2fi該語句先執行表達式,若表達式值為真則執行命令表1,否則執行命令表2。為了滿足用戶更多要求和便于編程,shell還提供if語句的嵌套結構,把多個if語句連用,完成用戶更復雜的要求和判斷。連用結構如下:if表達式1;then命令表1elseif表達式2;then命令表2elseif表達式3;then命令表3else命令表4fififi這是一個if語句的三重結構,還可以有更多重的復雜結構。這種結構采用簡潔方式,把if和then放在一行,但在then之前要加“;”號。12/21/2022434.5.2條件語句if條件語句是最簡單最基本的控制結構。根【例】4.12當用戶將某文件作為設定文件時,先檢查是否存在,然后將該文件的設定值載入。#Filename:/etc/ppp/settingsPHONE=1-800-COLLECT#!/bin/sh#Filename:phonebillif[-f/etc/ppp/settings];thensource/etc/ppp/settingsecho$PHONEfi執行結果情況:[foxman@foxmanppp]#./phonebill1-800-COLLECT12/21/202244【例】4.12當用戶將某文件作為設定文件時,先檢查是否存在【例】4.13如果某個設定文件允許有好幾個位置的話,例如crontab,可利用iftheneliffi來找尋。#!/bin/shif[-f/etc/crontab];thenCRONTAB="/etc/crontab"elif[-f/var/spool/cron/crontabs/root];thenCRONTAB="/var/spool/cron/crontabs/root"elif[-f/var/cron/tabs/root];thenCRONTAB="/var/cron/tabs/root"fiexportCRONTAB12/21/202245【例】4.13如果某個設定文件允許有好幾個位置的話,例如c4.5.3開關語句caseBash中的case結構與C語言中switch功能相似,用于多分支控制。【例】4.14運用case結構進行分支選擇。

#!/bin/bashecho"Hitakey,thenhitreturn."readKeypresscase"$Keypress"in[a-z])echo"Lowercaseletter";;[A-Z])echo"Uppercaseletter";;[0-9])echo"Digit";;*)echo"Punctuation,whitespace,orother";;esacexit0其中第四行的"readKeypress"的read語句是從鍵盤讀輸入。12/21/2022464.5.3開關語句caseBash中的case結構與C語言開關語句case允許把一個和多個選項值進行比較。結果匹配就轉到相應的命令表,直至遇到兩個分號為止。如果沒有匹配值,則執行默認命令。此語句的基本形式結構為:case變量in選項1)命令表1;;…選項n)命令表n;;esac在case語句中,每個選擇中的命令表都以“;;”結束,表示跳出開關語句,最后一個“;;”可省略。12/21/202247開關語句case允許把一個和多個選項值進行比較。結果匹配就轉12/21/20224812/18/20224812/21/20224912/18/2022494.5.4循環語句forshell中有for、while和until三種循環語句。for結構與C語言中有所不同,針對的是一組命令進行多次執行的循環體。基本語法結構為:for變量名in變量表do命令表done變量名是用戶所使用的循環變量的名字。變量表中是取值范圍和循環執行次數。do和done中間的命令表稱為循環體。當執行循環時,系統依次把變量表中的變量賦給變量,然后執行命令表,直到變量表中的所有變量都執行一遍為止。變量名可以是用戶選擇的任何字符串,如果變量名是var,則在in之后給出的數值將順序替換循環命令列表中的$var。如果省略了in,則變量var取值是位置變量。對變量的每一個可能賦值都將執行do和done之間的命令列表。【例】4.17在屏幕上打出1~7這七個數字。$cat>showprogforiin1234567doecho$idone12/21/2022504.5.4循環語句forshell中有for、while和12/21/20225112/18/202251【例】4.18運用for語句來實現循環。

#!/bin/bashfordayinSunMonTueWedThuFriSatdoecho$daydone【例】4.19分析下面的這個程序。#!/bin/bashforparamdoecho$paramdoneexit0上面這個程序將列出所有命令行中給出的參數。12/21/202252【例】4.18運用for語句來實現循環。12/18/2【例】4.20修改文件類型名。把*.txt文件一次性改名成*.doc文件。#!/bin/shFILES=`ls/txt/*.txt`fortxtin$FILES;dodoc=`echo$txt|sed"s/.txt/.doc/"`mv$txt$docdone這樣可以將*.txt文件修改成*.doc文件。【例】4.21編寫程序catmore實現多文件內容顯示。#!/bin/sh#Filename:catmorefori;docat$idone當用戶輸入"catmorefile1file2..."時,其作用就跟"catfile1file2..."一樣。12/21/202253【例】4.20修改文件類型名。把*.txt文件一次性改名【例】4.22編寫程序文件listbin實現"ls/bin/*"的功能。#!/bin/sh#Filename:listbinforiin/bin/*;doecho$idone【例】4.23改寫RedHat的啟動文件/etc/rc.d/rc,在其中加上命令找出/etc/rc.d/rcX.d/S*所有文件,檢查存在與否并一一執行。foriin/etc/rc.d/rc$runlevel.d/S*;do#Checkifthescriptisthere.[!-f$i]&&continue#Checkifthesubsystemisalreadyup.subsys=$[-f/var/lock/subsys/$subsys]||[-f/var/lock/subsys/$.init]&&continue#Bringthesubsystemup.$istartdone12/21/202254【例】4.22編寫程序文件listbin實現"ls/bi4.5.5循環語句while12/21/2022554.5.5循環語句while12/18/202255【例】4.25編寫程序判斷命令的位置變量屬性。如果是普通文件顯示其內容;否則顯示“不是文件名”。每次循環處理一個位置變量$1,用shift左移位置變量。while[$1]doif[-f$1]thenecho"display:$1"cat$1elseecho"$1isnotafilename."fishiftdone本程序的運行結果如圖4.4所示。12/21/202256【例】4.25編寫程序判斷命令的位置變量屬性。如果是普通文4.5.6循環語句untiluntil語句與while語句相似,但測試條件不同。當條件為假時,進入循環體,直至測試條件為真時才退出循環。循環語句until的基本結構是:until測試條件

do命令表

done【例】4.26用until語句編寫程序顯示1-9的平方值。$catsquare2i=1untiltest“$i”–gt9dos=`expr$i\*$i`echo“$i$s”i=`expr$i+1`done12/21/2022574.5.6循環語句untiluntil語句與while語4.5.7循環控制命令break和continueBash中的break和continue語句,作用和用法和C語言中相同。break語句讓程序流程從當前循環體中完全跳出,而continue語句則跳出當次循環直接進入下一次循環。這兩個語句都必須放在do和done之間有效。break是shell的內部命令,其格式為break或breakn。當執行break命令時,控制流從循環體中轉移到done之后的第一條命令上。當執行breakn時,則終止最內層的n個循環的執行。continue也是shell的內部命令,其格式為continue或continuen。該命令用于在循環體中根據命令運行的返回條件,直接進入下一次循環命令的執行。當執行continue命令時,控制流從本次循環直接轉到下一次循環。當執行continuen命令時,則跳過最里層n次循環體的執行,從第n+1次循環開始執行。12/21/2022584.5.7循環控制命令break和continueBash4.5.8流程控制selectselect語句是pdksh提供的一個獨特的循環語句,不同于前面介紹的循環語句。它不是反復計算一個條件表達式并依據表達式的值決定是否執行一組命令。select的功能是自動生成一個簡單的文本菜單。其語法格式是:selectmenu[inlist_of_items]do命令表done當執行一個select語句時,pdksh分別為每個列在list_of_items中的成員建立一個菜單選項。list_of_items既可以是一個包含多個選項的變量,也可以是直接列在程序中的一組選項。12/21/2022594.5.8流程控制selectselect語句是pdks【例】4.27select語句使用位置變量作為list_of_itemsselectmenuiteminpick1pick2pick3doecho"areyousureyouwanttopick$menuitem"readres;接收用戶的輸入,并且將輸入的值存放在特定變量里.if[$res="y"-o$res="Y"]thenbreak;用于退出while,for,select等循環語句fidoneselectname[inword;]dolist;doneselect顧名思義就是在word中選擇一項。與for相同,如果[inword;]省略,將會使用Script后面所加的參數。12/21/202260【例】4.27select語句使用位置變量作為list_o4.5.9shift語句和repeat語句bash和tcsh都支持shift命令。shift將存放在位置變量中的命令行參數,依次向左傳遞。例如位置變量當前值為:$1=file1$2=file2$3=file3執行一次shift命令后,位置變量的值為:$1=file2$2=file3還可以在shift命令中指定位置變量轉移的次數,如:#shiftn。。使用repeat要求shell對一個命令執行一定的次數。語法格式:#repeatcountcommand【例】4.28repeat的使用。foreachnum($*)repeat$numecho-n"*"echo""end本程序的運行結果見圖4.5所示。12/21/2022614.5.9shift語句和repeat語句bash和tcs4.6程序調試當shell程序較長較復雜或用于修改系統配置時就需要調試命令。shell提供了幾種對程序調試的命令,可以觀察程序的執行,或程序在不做任何實際處理情況下是如何被“執行”的。語法檢查shell的語法檢查允許用戶在執行shell程序前先檢查shell程序的語法,但不執行命令行。語法檢查命令的基本格式為:sh–n文件名或set–n12/21/2022624.6程序調試當shell程序較長較復雜或用于修改系統配置【例】4.29對下面的文件名為t2的shell腳本進行語法檢查。a=1if[a=1]echo$afi用語法檢查命令檢查該程序:$sh-nt2則屏幕上顯示: t2:line4:syntaxerrornearunexpectedtoken‘fi’

t2:line4:’fi’檢查命令在試圖讀第4行時,發現‘if’語句沒有正確結束。因為第2行的if語句沒有用then語句正確結束。把if[a=1]這一行改為:

if[a=1];then再用語法檢查命令檢查該程序,就沒有語法錯誤了。12/21/202263【例】4.29對下面的文件名為t2的shell腳本進行語法shell程序的詳細跟蹤shell詳細跟蹤特性允許用戶觀察shell程序的讀入和執行。命令行被讀入后,shell按讀入時的形式在標準輸出中顯示該命令行,然后執行命令行。詳細跟蹤有兩種方式:(1)整個程序的跟蹤執行:sh-v文件名。(2)局部跟蹤執行:set–v用于設置跟蹤標志;set+v用于關閉跟蹤標志。shell程序的跟蹤執行shell允許用戶觀察shell程序的執行。它使命令行在執行前完成所有替換,在標準輸出中顯示每一個被替換后的命令行,并且在行前加前綴符號“+”,然后執行該命令。跟蹤執行也有兩種方式:(1)整個程序的跟蹤執行:sh-x文件名。(2)局部跟蹤執行:set–x用于設置跟蹤標志;set+x用于關閉跟蹤標志。12/21/202264shell程序的詳細跟蹤12/18/202264詳細跟蹤與跟蹤執行的組合基本格式為:(1)整個程序的跟蹤執行:sh–vx文件名。(2)局部跟蹤執行:set–vx設置跟蹤標志;set+vx關閉跟蹤標志。詳細跟蹤和跟蹤執行的區別在于:在執行命令前,詳細跟蹤顯示命令行的原始內容,而跟蹤執行則顯示經過替換后的命令行的內容。12/21/202265詳細跟蹤與跟蹤執行的組合12/18/202265【例】4.30分析對于下面的程序t4的詳細跟蹤與跟蹤執行的情況b=“005”test“$b”–eq5echo$?詳細跟蹤命令:$sh–vt4跟蹤執行命令:$sh–xt4詳細跟蹤與跟蹤執行的組合情況:$sh–vxt4b=“005”+b=005test“$b”–eq5+test‘005’–eq5echo$?+echo00所有這些選項也可以在一個shell程序內部用“set-選項”的形式引用,而“set+選項”將禁止該選項起作用。12/21/202266【例】4.30分析對于下面的程序t4的詳細跟蹤與跟蹤執行的5.腳本調試基本格式:#sh–nvx其中-n檢查語法錯誤,不執行;-v執行前先顯示代碼;-x執行后顯示用到的代碼。調用shell的形式是:sh-選項程序名其中選項是:-n讀入命令但不執行。-v讀入shell輸入行時把它們顯示出來。-x執行命令時把命令和它們的參數顯示出來。所有這些選項也可以在一個shell程序內部用“set-選項”的形式引用,而“set+選項”將禁止該選項起作用。12/21/2022675.腳本調試12/18/2022676.信號與trap當得到信號的時候怎么辦,具體的信號可以用trap-l來看。使用方法:trapcommandsignal_name常用的有:HUB掛起,如斷線;INT

中斷,如Ctrl+C;QUIT退出,如Ctrl+;ABRT

終止,執行錯誤等;ALRM超時報警;TERM系統終止,如root關機。trap命令用于在shell程序中捕捉到信號,然后采取三種不同的反應:(1)執行一段程序來處理這一信號。trap命令在shell接受到signallist清單中數值相同的信號時,將執行雙引號中的命令串。trap'commands'signal-listtrap“commands'”signal-list(2)接受信號的默認操作。trapsignal-list12/21/2022686.信號與trap12/18/202268(3)忽略這一信號。trap""Signal-list但trap對信號11(段違例)不能捕捉,因為shell需要捕捉該信號進行內存轉儲。在trap中可以定義對信號0的處理(實際上無此信號),shell程序在其終止(如執行exit)時發該信號。在捕捉到signal-list中指定的信號并執行完相應的命令后,如果這些命令沒有將shell程序終止,shell將繼續執行受到信號時執行命令后面的命令,但容易導致shell程序無法終止。在trap語句中,單引號和雙引號不同,當shell第一次碰到trap語句時將把commands中命令掃描一遍。若commands在單引號里,shell不會對commands中的變量和命令替換,否則commands中的變量和命令將用當時具體值替換。12/21/202269(3)忽略這一信號。trap""Signal-list14.7shell編程綜合范例4.7.1系統自動備份程序設計利用shellScript搭配crond可以完成定期的工作。如對系統的備份問題,可以用一些壓縮工具。tar及gzip是最基本的。用戶會看見大量的tar.gz或tgz文件,被稱為tarball。用戶也可以用bzip2、zip等壓縮工具來進行壓縮,但tar配合gzip是最普遍最方便的組合方式。最常用的指令是:tar-cfile/dir...|gzip-9>xxxx.tar.gz。也可以分兩步完成:tar-rfile/dir...-fxxx.tar和gzip-9xxxx.tar或tar-rfile/dir...-fxxxx.tar和gzip-9<xxxx.tar>xxxx.tar.gz。12/21/2022704.7shell編程綜合范例4.7.1系統自動備份程序設計完成文件備份任務的backup程序#!/bin/sh#Filename:backupDIRS="/etc/var/your_directories_or_files"BACKUP="/tmp/backup.tgz"tar-c$DIRS|gzip-9>$BACKUP其中DIRS是備份目標,BACKUP是備份文件名稱和存放位置。不要將/tmp放進DIRS中,這樣會自身重復備份,導致硬盤空間溢出錯誤。下面進行腳本測試:#chmod755backup#./backup執行完成后在/tmp中會生成一個名為backup.tgz的備份文件。解壓時,請用gzip-dc/tmp/backup.tgz|tar-xv指令完成,或tarxvfz/tmp/backup.tgz。備份對象一般是系統中最重要的,如/etc中的文件,更重要的是用戶資料。對于/bin、/sbin、/usr/bin、/usr/sbin、/usr/X11R6/bin等系統文件目錄可不備份。通過簡單的shell腳本程序配合cron定時工具,就把原本耗費多時的人工備份工作,簡化到幾分鐘的自動工作,提高了效率和可靠性。12/21/202271完成文件備份任務的backup程序#!/bin/sh12/1

溫馨提示

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

評論

0/150

提交評論