基礎(chǔ)shell文檔v21_第1頁
基礎(chǔ)shell文檔v21_第2頁
基礎(chǔ)shell文檔v21_第3頁
基礎(chǔ)shell文檔v21_第4頁
基礎(chǔ)shell文檔v21_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、基礎(chǔ)Shell文檔V2.1本章菜單1 Shell基礎(chǔ):2 Bash shell主要優(yōu)點(diǎn)3 shell編程必須知道的基本語法:4 結(jié)構(gòu)化命令編程:5 如何向程序里面?zhèn)鬟f參數(shù)6 如何定時(shí)運(yùn)行程序和如何讓程序開機(jī)時(shí)運(yùn)行7 shell腳本函數(shù)8 附錄【注】更新日期:2014年7月12日1 Shell基礎(chǔ):1.1 Shell定義在計(jì)算機(jī)科學(xué)中,Shell俗稱殼(用來區(qū)別于核),是指“提供使用者使用界面”的軟件(命令解析器)。它類似于DOS下的command和后來的cmd.exe。它接收用戶命令,然后調(diào)用相應(yīng)的應(yīng)用程序。只要能都操作應(yīng)用程序的接口的都能稱為shell。狹義的shell指的是命令行方面的軟件

2、,包括本章要介紹的bash等,廣義的shell則包括圖形界面的軟件。1.2 為什么要使用shell在Linux系統(tǒng)中,雖然有各種各樣的圖形化接口工具,但是shell仍然是一個(gè)非常靈活的工具。Shell不僅僅是命令的收集,而且是一門非常棒的編程語言。您可以通過使用shell使大量的任務(wù)自動(dòng)化,shell特別擅長系統(tǒng)管理任務(wù),尤其適合那些易用性、可維護(hù)性和便攜性比效率更重要的任務(wù)。1.3 如何建立一個(gè)腳本Linux中有好多中不同的shell,但是通常我們使用bash (bourne again shell) 進(jìn)行shell編程,因?yàn)閎ash是免費(fèi)的并且很容易使用。所以在本文中筆者所提供的腳本都是使

3、用bash(但是在大多數(shù)情況下,這些腳本同樣可以在bash的大姐,bourne shell中運(yùn)行)。如同其他語言一樣,通過我們使用任意一種文字編輯器,比如nedit、kedit、emacs、vi等來編寫我們的shell程序。程序必須以下面的行開始(必須方在文件的第一行):#!/bin/sh符號(hào)#!用來告訴系統(tǒng)它后面的參數(shù)是用來執(zhí)行該文件的程序。在這個(gè)例子中我們使用/bin/sh來執(zhí)行程序。當(dāng)編輯好腳本時(shí),如果要執(zhí)行該腳本,還必須使其可執(zhí)行。要使腳本可執(zhí)行:chmod u+x filename然后,您可以通過輸入: ./filename 來執(zhí)行您的腳本。2 Bash shell主要優(yōu)點(diǎn)2.1 命

4、令記憶能力(history)2.2 命令與文件補(bǔ)全功能(Tab按鍵的功能)Tab接在一串命令的第一個(gè)字的后面,則為命令補(bǔ)全;Tab接在一串命令的第二個(gè)字的后面,則為文件補(bǔ)全2.3 命名別名設(shè)置功能(alias)2.4 作業(yè)控制、前臺(tái)、后臺(tái)控制(job control,foreground,background)2.5 程序腳本(shell script)-批處理文件2.6 通配符(Wildcard)3 shell編程必須知道的基本語法:3.1 如何使用多個(gè)命令方法一:在終端上使用“;”來隔開不同的命令方法二:創(chuàng)建一個(gè)shell 腳本3.2 如何創(chuàng)建一個(gè)shell腳本-shell腳本的基本格式#

5、!/bin/bash#this is the first shelldatewho#the end3.3 如何運(yùn)行一個(gè)shell腳本程序-加可執(zhí)行權(quán)限chmod u+x test./test3.4 shell腳本中的echo命令-相當(dāng)于c語言中的printf·格式如下:echo This is a testecho “This is a test to see if it will work”echo Rich says “scripting is easy” . 【要輸出雙引號(hào)】echo “Lets see whos logged into the system: ”【要輸出單引號(hào)

6、】echo n 的用法 【不輸出回車】3.5 使用變量a) 環(huán)境變量b) 用戶變量在變量名字前面加上$符號(hào)來引用變量的值如:days=10 #等于號(hào)兩邊不能有空格guest=”Katie”echo “$guest will visite us $day days after”3.6 反引號(hào)-是shell腳本中最重要的特性之一,反引號(hào)允許你將shell命令的輸出賦值給一個(gè)變量,注意shell中的變量不需要顯式指定類型,系統(tǒng)會(huì)自動(dòng)識(shí)別,可以直接調(diào)用如:testing=dateecho “The date and time are: ”$testing一個(gè)讓系統(tǒng)自動(dòng)創(chuàng)建日志文件日期的方法:today

7、=date +%y%m%dls /usr/bin al > log.$today echo后必須有空格3.7 重定向輸入和輸出c) 輸出重定向command > outputfile【注】使用>時(shí),會(huì)覆蓋原文件,使用>>時(shí),會(huì)追加到原文件中;d) 輸入重定向command < inputfile【注】使用<時(shí),會(huì)覆蓋原文件,使用<<時(shí),會(huì)追加到原文件中;內(nèi)聯(lián)輸入重定向command << markersentencesmarker*如:wc<<EOF“hello”“wangbing”“xiaofeng”EOF3.8

8、管道 command | commandrpm qa | morerpm qa | sort3.9 如何在shell中進(jìn)行數(shù)學(xué)運(yùn)算e) expr命令-只能進(jìn)行整數(shù)類型的運(yùn)算,且需要使用反引號(hào)來獲取expr命令的輸出如:sramlocalhost shell$ expr 3 + 58sramlocalhost shell$ expr 3 - 5-2sramlocalhost shell$ expr 3 / 50sramlocalhost shell$ expr 3 * 5expr: 語法錯(cuò)誤sramlocalhost shell$ expr 3 * 515乘除運(yùn)算符需要添加轉(zhuǎn)義,另外運(yùn)算符左右必

9、須有空格f) 使用方括號(hào)來代替expr命令進(jìn)行運(yùn)算格式:var=$ 運(yùn)算表達(dá)式 g) 進(jìn)行浮點(diǎn)運(yùn)算的解決方法,使用shell內(nèi)建的bash計(jì)算器,小數(shù)點(diǎn)位數(shù)是由scale變量來控制的如終端下使用:bc q #終端輸入3.44 / 50 #結(jié)果scale=4 #設(shè)置scale3.44 / 5.6880 #結(jié)果quitshell腳本中使用:格式:var=echo “options; expression” | bc如:#!/bin/bashvar1=echo “scale=4; 3.44 / 5” | bcecho The answer is $var1如何進(jìn)行多個(gè)表達(dá)式的運(yùn)算:#!/bin/ba

10、shvar1=10.46var2=43.67var3=33.2var4=71var5=bc << EOFscale=4 #小數(shù)點(diǎn)的位數(shù)為4a1 = ($var1 * $var2)a2 = ($var3 * $var4)a1 + a2EOF變量a1、a2和var1等是不同的,顯示變量只能是var5等3.10 命令的退出狀態(tài)碼,每個(gè)命令都有一個(gè)退出狀態(tài)碼,成功執(zhí)行為0,不成功非0,用echo $?命令可以查看退出狀態(tài)碼,但是用exit 命令可以指定退出狀態(tài)碼的值4 結(jié)構(gòu)化命令編程:4.1 條件語句系列(1)使用if-then語句,格式如下:if commandthencommandsf

11、i或者if command ; thencommandsfi(2)使用if then else 語句,格式如下:if commandthencommandselsecommandsfi(3)嵌套使用if,格式如下:if command1then commandselif command2thenmore commandsfi(4)前面所講的if-else語句,if只能接受shell命令作為判斷條件,不能接受普通的任意表達(dá)式,使用test可以克服這個(gè)缺點(diǎn),格式如下:if test conditionthen commandsfi或者if commands then commandsFi建議使用中

12、括號(hào)形式 test命令可以判斷3類條件:·數(shù)值比較n1 eq n2;檢查n1,n2是否相等n1 ge n2;檢查n1是否大于等于n2n1 gt n2;檢查n1是否大于n2n1 le n2;檢查n1是否小于等于n2n1 -lt n2;檢查n1是否小于n2n1 ne n2;檢查n1是否不等于n2·字符串比較str1 = str2;檢查str1是否和str2相同str1 != str2;檢查str1是否和str2不同str1 < str2;str1 > str2-n str1;檢查str1的長度是否非0即notzero-z str1;檢查str1的長度是否為0

13、3;文件比較-d file;檢查file是否存在并是一個(gè)目錄-e file;檢查file是否存在-f file;檢查file是否存在并是一個(gè)文件-r file;檢查file是否存在并可讀-s file;檢查file是否存在并非空-w file-x file-O file;檢查file是否存在并屬當(dāng)前用戶所有-G file ;檢查file是否存在并且默認(rèn)組與當(dāng)前用戶相同file1 nt file2;檢查file1是否比file2新file1 ot file2;檢查field1是否比file2舊*如:找出a,b,c中的最小值 #!/bin/bash 8 a=5 9 b=6 10 c=8 11 if

14、 $a -gt $b 12 then 13 min=$b 14 else 15 min=$a 16 fi 17 18 echo "min1=:"$min 19 20 if $min -gt $c 21 then 22 min=$c 23 fi 24 25 echo "min2=:"$min(5)前面我們所講的if-then語法格式并不符合我們c語言中的格式,現(xiàn)在我們來講一下if-then的高級(jí)特性a) 使用雙圓括號(hào)(有些地方稱作雙尖括號(hào))允許你將高級(jí)數(shù)學(xué)表達(dá)式放入進(jìn)行比較如:if ( $var1 * 2 > 90 ) thencommandsfi雙

15、尖括號(hào)里面可以識(shí)別的命令符號(hào):var+, var-, +var, -var, !邏輯求反, 位求反, *冪運(yùn)算, <<, >>, &, |, &&, |有了這些,我們的shell就和c語言的語法比較接近了。b) 使用雙方括號(hào) expression 針對(duì)字符串進(jìn)行比較的高級(jí)特性,對(duì)字符串進(jìn)行模式匹配如:#!/bin/bashif $USR = r* thenecho “Hello $USR”elseecho “Sorry, I dont know you”fi(6)用case命令來替換if-then-else語句,對(duì)比c語言語法格式來學(xué)習(xí)直接來例子

16、進(jìn)行比較:例子1:#!/bin/bashif $USER = “Rich” thenecho “welcome $USER”elif $USER = “barbara” thenecho welcome $USERelif $USER = testing thenecho welcome $USERelseecho ”sorry, you are not allowed here”fi例子2:case $USER in #想當(dāng)于switch(USER)Rich | Barbara)echo “Welcome, $USER”;#注意結(jié)尾符號(hào)testing)echo “Welcome, $USER

17、, nice your visite”;*) #相當(dāng)于defaultecho “sorry, we are not allowed here”;esac #結(jié)束標(biāo)識(shí)4.2 循環(huán)語句系列(1) for命令格式for var in listdocommandsdone用var讀取list里面的值進(jìn)行遍歷輸出如:for test in Albame Alaska Arizona Californiadoecho The next place is $testdone 如:for file in /etc/*doif -d “$file” thenecho “$file is a directory”

18、elif -f “$file” thenecho “$file is a file”fidone(2) c語言風(fēng)格的for命令for ( a = 1; a < 10; a+ )doecho “The number is $a”done(3) while命令格式:while command docommandsdone如:var1=10while $var1 gt 0 doecho $var1var1=$ $var1 1 done(4) until命令,與while命令工作的方式相反格式:until commands do commandsdone(5) 嵌套循環(huán)如:for ( a = 1

19、; a <= 3; a+ )doecho “Starting loop $a: ”for ( b = 1; b <= 3; b+ )doecho“ Insert loop $b”donedone循環(huán)語句一個(gè)比較有實(shí)際意義的用法是循環(huán)處理文件數(shù)據(jù)IFS默認(rèn)值為空格,如你可以編程實(shí)現(xiàn)逐行遍歷/ets/passwd文件并輸出內(nèi)容,這里你需要將IFS變量的值改為冒號(hào)【注】IFS(Internal Field Seperator)在Linux的shell中預(yù)設(shè)的分隔符,用來把command line分解成word(字段)。IFS的設(shè)置方法很簡單,和普通變量設(shè)置方法類似:IFS=":

20、"如:#!/bin/bashecho entry=$entryIFS.OLD=$IFSIFS=$'n'for entry in cat /etc/passwddoecho "Value in $entry -"IFS=:for value in $entrydoecho "$value"donedoneIFS=$IFS.OLD(6) break 命令和continue 命令 使用break 1可以跳出當(dāng)前循環(huán),break 2跳出兩次循環(huán)如:#!/bin/bashfor (a = 1; a < 4; a+)doecho &q

21、uot;Outer loop: $a"for (b = 1; b < 100; b+)doif $b -eq 5 thenbreakfiecho "在第 $b 循環(huán)"donedone如2:#!/bin/bashfor (var1 = 1; var1 < 15; var1+)doif $var1 -gt 5 && $var1 -lt 10 then continue fiecho "Interaction is $var1"done(7)處理循環(huán)的輸出,你可以添加一個(gè)命令將循環(huán)的輸出不顯示在屏幕上,而是重定向到一個(gè)文件

22、夾只需要在done命令后加上如:done > output.txt5 如何向程序里面?zhèn)鬟f參數(shù)前面我們程序里面需要的變量都是預(yù)先定義賦好值的,不能進(jìn)行交互式的輸入,這在一般程序設(shè)計(jì)時(shí)是不可能的,現(xiàn)在我們講一下如何向程序里面?zhèn)鬟f參數(shù)5.1 第一種方法是用命令行參數(shù)來向程序傳遞參數(shù)如:./test 3 5,這個(gè)命令行我們輸入了三個(gè)參數(shù),在程序里直接對(duì)應(yīng)$0,$1,$2,它們相當(dāng)于變量的名字,在程序里可以直接調(diào)用,相當(dāng)于$1=3, $2=55.2 另一種方法是用read命令,可以讓你在程序執(zhí)行期間進(jìn)行輸入,如:echo n “Enter your name: ”read nameecho “He

23、llo $name, nice name. ”從文件test中讀取內(nèi)容的方法:count=1cat test | while read linedoecho “Line $count: $line”count=$ $count + 1 doneecho “I have finished read file”6 如何定時(shí)運(yùn)行程序和如何讓程序開機(jī)時(shí)運(yùn)行6.1 用at 命令來計(jì)劃執(zhí)行作業(yè)at -f filename time6.2 at命令只能讓程序在某個(gè)時(shí)間只執(zhí)行一次,運(yùn)用cron時(shí)間表可以讓我們實(shí)現(xiàn)定期要執(zhí)行的腳本cron時(shí)間表命令格式如下:min hour dayofmonth month d

24、ayofweek command(腳本全路徑)6.3 開機(jī)時(shí)運(yùn)行腳本,很簡單,只要你將你要運(yùn)行的腳本放在開機(jī)時(shí)需要執(zhí)行的腳本文件夾下就可以了,當(dāng)然具體執(zhí)行的時(shí)候還涉及到很多內(nèi)容,這里不詳述了。7 shell腳本函數(shù)7.1基本腳本函數(shù)(1).創(chuàng)建函數(shù)兩種方法:a.function namecommandsb. name( ) commands如:注意:每個(gè)函數(shù)名必須唯一,如果重新定義函數(shù)那么新定義將取代函數(shù)原先的定義,而這不會(huì)引發(fā)錯(cuò)誤消息。7.2函數(shù)退出狀態(tài)Bash shell將函數(shù)看作小型腳本,并以退出狀態(tài)結(jié)束,函數(shù)退出狀態(tài)有三種方式a) 使用標(biāo)準(zhǔn)變量$?來確定函數(shù)的退出狀態(tài)b) 使用retu

25、rn命令c) 使用函數(shù)輸出7.3向函數(shù)傳遞參數(shù)如下:這里的函數(shù)所使用的參數(shù)值為私有的參數(shù)環(huán)境變量,所以函數(shù)無法從腳本命令行訪問腳本參數(shù)值,即函數(shù)所使用的變量$1和$2,不同于腳本主代碼的變量$1和$2,如果函數(shù)想使用,必須在調(diào)用該函數(shù)時(shí)手動(dòng)傳遞這些數(shù)據(jù)。7.4函數(shù)使用的全局變量和局部變量(1)全局變量是在shell腳本內(nèi)處處有效的變量。默認(rèn)情況下,腳本中定義的變量都是全局變量,在函數(shù)外部定義的變量,在函數(shù)內(nèi)部仍能正常訪問(2)與全局變量相對(duì),函數(shù)內(nèi)部使用的變量可以稱為局部變量,只需要在局部變量前面冠以local關(guān)鍵字,關(guān)鍵字local確保變量僅在函數(shù)內(nèi)部使用,如果腳本在函數(shù)外部有同名變量,那么

26、shell將能區(qū)分開這兩個(gè)變量。8 附錄8.1 PS1使用詳解使用方法:# PS1='自定義內(nèi)容'注意兩邊的單引號(hào)示例: PS1='(uH d t)$'-PS1:就是用戶平時(shí)的提示符。PS2:第一行沒輸完,等待第二行輸入的提示符。Linux系統(tǒng)提示符是用系統(tǒng)變量PS1來定義的。一般系統(tǒng)默認(rèn)的形式是:usernamehost 工作目錄$.用echo $PS1可以得到PS1的值,即PS1="uh w"$登錄后可以更改PS1的顯示樣式,但是當(dāng)退出重啟登錄進(jìn)入系統(tǒng)后,樣式又變成系統(tǒng)默認(rèn)的樣式了,如果要徹底改變它的樣式,只能從配置文件中改。PS是在用戶

27、根目錄下的.bash_profile中定義的。如# .bash_profile# Get the aliases and functionsif -f /.bashrc ; then. /.bashrcfi# User specific environment and startup programs#以下是設(shè)定的PS1的值PS1="uh w$"PATH=$PATH:$HOME/bin#使用export把PS1輸出,以使它可以在子shell中生效,這會(huì)造成ROOT用戶的也采用此樣式#export PS1 要慎用export PATHunset USERNAME下面簡單說說環(huán)境下默認(rèn)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論