Shell程序設(shè)計_第1頁
Shell程序設(shè)計_第2頁
Shell程序設(shè)計_第3頁
Shell程序設(shè)計_第4頁
Shell程序設(shè)計_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、曙光信息產(chǎn)業(yè)股份有限公司 Shell程序設(shè)計提綱1. Shell簡介2. Bash編程基礎(chǔ)3. 常用字符處理工具介紹 什么是Shell?1. 命令解釋器2. 程序設(shè)計語言 腳本(Scripting) hardwareKernel ShellApplications為什么要學(xué)習(xí)Shell?nShell是Linux的用戶接口n簡單易用的命令組合完成復(fù)雜任務(wù)n強(qiáng)大的綜合處理功能n一生受用好工具n.Shell有哪些種類?n當(dāng)前系統(tǒng)安裝的Shell可以通過 cat /etc/shells 查看n用戶的默認(rèn)登錄Shell可以通過 cat /etc/passwd 查看n/bin/csh (c-like sh

2、ell) n/bin/ksh (kornshell, by AT&T Bell LAB) n/bin/tcsh (enhanced csh, FreeBSD default login shell) n/bin/bash (bourne-again shell) n/bin/dashn.提綱1. Shell簡介2. Bash編程基礎(chǔ)3. 常用字符處理工具介紹Bash Shell發(fā)展歷史:AT & T 設(shè)計Unix 時設(shè)計了Bourne Shell;Bash: Bourne Again Shell, GNU Project大多數(shù)Linux發(fā)行版的默認(rèn)Shell;Bash的內(nèi)部命令Bash集成了一

3、些內(nèi)部命令,組成基本操作環(huán)境常用的內(nèi)部命令::(true) .(source) alias bg bind builtin cd declare dirs disown echo enable eval exec exit export fc fg getopts hash help history jobs kill let local logout popd pushd pwd read readonly return set shift stop suspend test times trap typest ultimit umask unalias unset wait循環(huán)分支控制相關(guān)

4、:if else elif fi for do done case while until continue break Bash的初始化腳本通常在這些腳本中進(jìn)行自定義設(shè)置,比如一些程序的環(huán)境變量等/etc/profile/etc/bashrc/.bash profile/.bash login/.bashrc/.profileBash的執(zhí)行方式(交互式)Linux終端登錄后,即進(jìn)入交互式的執(zhí)行環(huán)境可以執(zhí)行內(nèi)部及外部命令foolocalhost lsa.txt b.txt c.txtfoolocalhost hostnamelocalhost后臺執(zhí)行: command &foolocalhos

5、t sleep 300 &Bash的執(zhí)行方式(腳本方式)腳本執(zhí)行方式,將Bash語句寫在文本文件中,批量執(zhí)行#開頭表示注釋不開啟子Shell,在當(dāng)前Shell中運(yùn)行:foolocalhost source test.shfoolocalhost . test.shfoolocalhost eval cat test.sh在新的子Shell中運(yùn)行:foolocalhost bash -c commandsfoolocalhost bash test.shfoolocalhost ./test.sh(腳本文件以#!/bin/bash開頭,且具有可執(zhí)行權(quán)限)Bash命令的組合方式不同的命令可分行放置

6、,也可以用分號隔開#!/bin/bashcd subdir1rm a.txtfoolocalhost cd /home/foo/subdir2; rm b.txtBash命令的組合方式(邏輯組合)管道線分隔符command1 & command2 (前者執(zhí)行成功才執(zhí)行后者)command1 | command2 (前者執(zhí)行失敗才執(zhí)行后者)foolocalhost cd /home/foo & rm b.txtfoolocalhost cd /home/foo | echo dir does not exist!Bash命令的組合方式(命令集合)命令集合 commands; 命令集合,在當(dāng)前Sh

7、ell執(zhí)行,注意前后的空格和分號(commands) 開啟新的子Shell執(zhí)行foolocalhost cd /home/foo; rm a.txt; foolocalhost (cd /home/foo; rm a.txt)Bash的別名設(shè)置(alias)可以定義一些命令的別名,方便使用,別名設(shè)置可以放在Bash的初始化腳本中自動加載foolocalhost alias ll=ls -l -color=ttyfoolocalhost alias llalias ll=ls -l -color=ttyfoolocalhost alias rm=rm -ifoolocalhost unalias

8、 ll取消別名Bash的變量變量申明、查看、清除var=value #注意=號前后無空格echo $varunset varfoolocalhost var1=abcfoolocalhost echo $var1abcfoolocalhost unset var1foolocalhost echo $var1(無輸出)Bash的變量(系統(tǒng)變量)常用系統(tǒng)變量:HOSTNAMETERMPATHHOMEPWDSHELL.foolocalhost echo $SHELL/bin/bashfoolocalhost echo $HOME/home/fooBash的變量(全局變量)全局變量(子Shell會繼

9、承)export var=valuefoolocalhost export var1=abcfoolocalhost var2=123foolocalhost export var2foolocalhost bash -c echo $var1 $var2abc 123Bash的變量(特殊變量)$?前一個命令的退出狀態(tài),正常退出返回0,異常退出返回非0值$#腳本或函數(shù)位置參數(shù)的個數(shù)$0腳本或函數(shù)的名稱$1, $2, .傳遞給腳本或函數(shù)的位置參數(shù)$*以”$1 $2.”的形式保存所有輸入的命令行參數(shù)$以“$1”“$2”.的形式保存所有輸入的命令行參數(shù)foolocalhost cat test.sh

10、#!/bin/bashecho The command is $0 $1 $2foolocalhost ./test.sh arg1 arg2The command is test.sh arg1 arg2Bash的變量(特殊變量)foolocalhost lsa.txt b.txtfoolocalhost echo $?0foolocalhost ls c.txtls: cannot access c.txt: No such file or directoryfoolocalhost echo $?2Bash的通配符通配符* 配任何字符串,包括空字符串? 匹配任何單個字符 按照字符范圍或列

11、表匹配.,. 按照字符串列表匹配 轉(zhuǎn)意符,使元字符失去其特殊的含義foolocalhost ls *.txtfoolocalhost ls A0?.txtfoolocalhost ls A-Z,a-z0-9.txtfoolocalhost ls !a-z*.txtfoolocalhost ls abc.txt,tar,datfoolocalhost echo *Bash的命令替換命令替換:把命令的輸出結(jié)果字符串直接替換進(jìn)來commands 注意是反引號,不是單引號$(commands)foolocalhost echo dateSun Jan 9 15:38:00 2011foolocalho

12、st files=lsfoolocalhost currentdir=$(pwd)Bash的變量參數(shù)替換foolocalhost echo $username無輸出foolocalhost echo $username-whoamifoofoolocalhost echo $username無輸出$variable-default如果變量沒有定義,則返回默認(rèn)值注意: 變量定義成空字符串也算定義Bash的變量參數(shù)替換(續(xù)1)foolocalhost echo $username無輸出foolocalhost echo $username=whoamifoofoolocalhost echo $u

13、sernamefoo$variable=default如果變量沒有定義,返回默認(rèn)值,且賦值給變量Bash的變量參數(shù)替換(續(xù)2)$variable+value如果變量已經(jīng)定義,返回+號后給定值,如果沒有,返回空$variable?msg如果變量已經(jīng)定義,返回變量本身,如果沒有,打印給定msgBash的變量字符串操作(子串提取)foolocalhost string=01234foolocalhost echo $#string5foolocalhost echo $string:2234foolocalhost echo $string:2:223$#string返回字符串的長度$string:

14、position提取從指定位置開始的子串$string:position:length 提取從指定位置開始的定長子串Bash的變量字符串操作(子串剪裁)foolocalhost string=abc.txtfoolocalhost echo $string#abc.txtfoolocalhost echo $string%.*abc$string#substring裁去從左邊最短匹配子串$string#substring裁去從左邊最長匹配子串$string%substring裁去從右邊最短匹配子串$string%substring裁去從右邊最長匹配子串如果子串不匹配,不做裁剪操作Bash的變量

15、字符串操作(子串替換)foolocalhost string=black-blackfoolocalhost echo $string/black/whitewhite-blackfoolocalhost echo $string/black/whitewhite-white$string/substring/replace替換第一處匹配$string/substring/replace替換所有匹配如果子串不匹配,不做裁剪操作Bash的變量數(shù)組(Array)賦值:array0=value1array1=value2.或者一次性賦值:array=(value1 value2 .)元素引用:$#a

16、rray* 變量元素個數(shù)$array0某個變量值$array*全部變量值foolocalhost array=(dog fish cat)foolocalhost echo $#array*3foolocalhost echo $array*dog fish catfoolocalhost echo $array0dogBash的終端控制(輸入輸出重定向)Linux 默認(rèn)的三個I/O 通道:stdin(標(biāo)準(zhǔn)輸入,文件描述符:0) 默認(rèn)是鍵盤stdout(標(biāo)準(zhǔn)輸出,文件描述符:1) 默認(rèn)是終端stderr(標(biāo)準(zhǔn)錯誤,文件描述符:2) 默認(rèn)是終端重定向stdout到文件(新建或覆蓋)重定向stdo

17、ut到文件(追加)2重定向stderr到文件(新建或覆蓋)2重定向stderr到文件(追加)2&1 重定向stderr到stdout&重定向stdout和stderr到文件Bash的終端控制(輸出重定向)foolocalhost ls *.txt,datls: cannot access *.txt: No such file or directorya.dat b.datfoolocalhost ls *.txt,dat /tmp/ls.outls: cannot access *.txt: No such file or directoryfoolocalhost cat /tmp/ls.

18、outa.dat b.datfoolocalhost ls *.txt,dat /tmp/ls.out 2/tmp/err.outfoolocalhost cat /tmp/err.outls: cannot access *.txt: No such file or directoryBash的終端控制(輸入重定向)命令的輸入定向到文件,而不是從鍵盤輸入foolocalhost tr a-z A-Z tr a-z A-Z result.logBash的終端控制(重定向到特殊文件)可以重定向到特殊字符設(shè)備文件e.g.foolocalhost ls result.log 2/dev/null注:

19、Linux下常用的特殊字符設(shè)備文件:/dev/null “空文件”或“黑洞文件”,丟棄一切寫入的內(nèi)容/dev/zero 永遠(yuǎn)提供NULL空字符Bash的終端控制(管道符)管道符pipe(|),將命令的輸出定向到下一條命令的輸入foolocalhost ls /usr/lib | lessfoolocalhost cut -f1 -d: /etc/passwd | sort -r | lessfoolocalhost cut -f1 -d: /etc/passwd | sort -r result.logBash讀入變量(read)使用內(nèi)部命令read,可以從終端讀入Shell變量與C語言的sc

20、anf()類似格式:read -p 提示字符 var1 var2foolocalhost cat read_test.sh#!/bin/bashread name ageecho $name is $age years old.foolocalhost ./read_test.sh輸入Bob 17,按Ctrl-dBob is 17 years old.foolocalhost echo Bob 17 | ./read_test.shBob is 17 years old.Bash中的引號單引號屏蔽所有特殊字符foolocalhost echo $HOME$HOMEfoolocalhost ec

21、ho $HOME/home/foofoolocalhost echo $HOME /home/foofoolocalhost echo $HOME /home/fooBash中的數(shù)學(xué)運(yùn)算(內(nèi)部命令)內(nèi)置命名 let let 或 (.)(.),只能用于整型運(yùn)算foolocalhost echo $( (1+1)*(2*2) )8foolocalhost a=1foolocalhost (a+=1)foolocalhost echo $a2foolocalhost a=1foolocalhost let a+=1foolocalhost echo $a2Bash中的數(shù)學(xué)運(yùn)算(外部命令)調(diào)用外部命令

22、exprexpr,只能用于整型運(yùn)算foolocalhost expr ( 1 + 1 ) * (2 * 2 )8foolocalhost a=expr 1 + 1foolocalhost echo $a2注意括號和運(yùn)算符前后有空格Bash中的數(shù)學(xué)運(yùn)算(外部命令)調(diào)用外部命令bcbc,可用于浮點(diǎn)運(yùn)算,功能強(qiáng)大foolocalhost echo 1.2*1.2 | bc -l 1.44foolocalhost echo ibase=10; obase=2; 10 | bc1010Bash中的邏輯判斷內(nèi)部命令testtest,可用于數(shù)字比較、字符串比較、文件狀態(tài)檢查、邏輯判斷等。語法:test co

23、nditiontest condition或 condition # condition #注意 前后的空格如果conditioncondition成立,返回0 0,不成立返回非0 0foolocalhost test 1 = 1; echo $?0foolocalhost 1 = 2 ; echo $?1Bash中的邏輯判斷(字符串比較)= =或=兩個字符串相等!=!=兩個字符串不等-z-z空字符串-n-n非空字符串=與正則表達(dá)式regexregex進(jìn)行比較foolocalhost str=abcfoolocalhost $str = abc & echo truetruefoolocalh

24、ost -z $str & echo true無輸出Bash中的邏輯判斷(整數(shù)比較)-eq-eq或=兩個整數(shù)相等-ne-ne或!=!=兩個整數(shù)不等-gt-gt或 前者大于后者-ge-ge或=前者大于等于后者-lt-lt或 前者小于后者-le-le或= var=1foolocalhost $var = 1 & echo truetruefoolocalhost $var file=/etc/hostsfoolocalhost -r $file & echo read permission OKread permission OKBash中的邏輯判斷(邏輯操作符)condition1 condit

25、ion1 -a-a condition2 condition2邏輯與condition1 condition1 -o -o condition2condition2邏輯或! ! condition condition邏輯取非foolocalhost a=2; b=3foolocalhost $a 1 -a $b 1 & echo truetruefoolocalhost ! $a 1 & echo true無輸出Bash中的分支判斷(if語句)if condition_judgementthen.fiif condition_judgementthen.else.fiif condition_

26、judgement1then.elif condition_judgement2then. else.fiBash中的分支判斷(if語句)#!/bin/bashif $1 1 then echo Greater than 1elif $1 /dev/nullthen echo “Entering dir succeedsfi舉例:條件判斷也可以是命令,執(zhí)行成功表示真Bash中的分支判斷(case語句)case expression inpattern1) .;pattern2).;.patternn).;esaccase expression inpattern1) .;pattern2).;

27、.patternn).;*).;esacBash中的分支判斷(case語句)#!/bin/bashcase $1 inapple)echo You choose apple;grape)echo You choose grape;*)echo “I have only apple and grape;esac舉例:Bash中的循環(huán)控制(for循環(huán))for var in value_listdo.donefor (var=0; var=10; var+)do.doneBash中的循環(huán)控制(for循環(huán))for name in tom bob cindydoecho $namedonefor (i=

28、0; i=10; i+)doecho $idone舉例:for i in seq 1 10dossh node$i datedone變量取值也可以來自其它命令的輸出Bash中的循環(huán)控制(while循環(huán))while condition_judgementdo.done條件判斷可以是:ntest test 或 . . 語句n其它命令,判斷其執(zhí)行成功與否ntruetrue 或 : : (Bash (Bash的內(nèi)部命令,代表真,使得whilewhile成為無限循環(huán)) )Bash中的循環(huán)控制(while循環(huán))COUNTER=0# If COUNTER 5, program will print the

29、value of it.while $COUNTER 5 doCOUNTER=$(COUNTER+1)echo $COUNTERdone舉例一:Bash中的循環(huán)控制(while循環(huán))NUMBER=0while $NUMBER != 9 ; doread -p Enter a integer, 9 to exit NUMBERecho You typed is $NUMBERdone舉例二:不停地從終端讀入一個整數(shù),輸入9 9則退出Bash中的循環(huán)控制(while循環(huán))while read LINEdoecho $LINE | sed -e s/node/blade/ done /dev/nul

30、lthenbreakfidone舉例四:無限循環(huán)及跳出break語句用于跳出循環(huán)break ,可以跳出多重循環(huán)Bash中的循環(huán)控制(until循環(huán))until condition_judgementdo.done與while循環(huán)語法一致,但意思“相反”,沒有while循環(huán)常用until循環(huán)是先執(zhí)行循環(huán),直到滿足判斷條件后跳出Bash中的函數(shù)在Shell 中,函數(shù)就是一組實現(xiàn)一定功能的命令集合;函數(shù)由兩部分組成:函數(shù)名(在一個腳本中必須唯一);函數(shù)體(命令集合);function_name().#先定義,后使用function_nameBash中的函數(shù)(函數(shù)參數(shù))swap_filename()f

31、ile1=$1file2=$2cp $file1 file1.bakmv $file2 $file1mv $file1.bak $file2與Bash腳本的位置參數(shù)一樣,函數(shù)的位置參數(shù)也用$1, $2, .表示舉例:交換兩個文件的文件名Bash中的函數(shù)(函數(shù)的退出狀態(tài))check_file_lines()file=$1lines=wc -l $file if $lines -gt 1000 ; thenreturn 0elsereturn -1 ficheck_file_lines result.log & echo file is long enough 函數(shù)結(jié)尾可以掉用return語句返回

32、執(zhí)行狀態(tài),0表示無錯誤舉例:提綱1. Shell簡介2. Bash編程基礎(chǔ)3. 常用字符處理工具介紹正則表達(dá)式regex正則表達(dá)式:進(jìn)行精確文字匹配的句法規(guī)則;比通配符強(qiáng)大無數(shù)倍.匹配任意單個字符*一個單字符后緊跟*,表示匹配該字符0次或任意多次匹配行首$匹配行尾匹配序列中的任何一個,比如abc123、a-z0-9.匹配非序列中的字符轉(zhuǎn)意特殊字符patternn匹配規(guī)則重復(fù)n次patternn,匹配規(guī)則重復(fù)至少n次patternn,m匹配規(guī)則重復(fù)至少n次,至多m次Regex的基本元字符集:正則表達(dá)式regex(續(xù)1)The匹配行首的The.*匹配任意字符或字符串$匹配空行.*$匹配任意行A0-

33、9.txt匹配A0.txt,A1.txt,.,A9.txt0-9a-zA-Z匹配非數(shù)字或字母的字符(0-91,3.)30-91,3匹配IPv4的IP地址Regex舉例:+一個單字符后緊跟+,表示匹配該字符1次或任意多次?一個單字符后緊跟?,表示匹配該字符0次或1次(patterns)匹配規(guī)則組合Regex的擴(kuò)展元字符集:字符查找工具grepgrep 是 Linux 下使用最廣泛的命令之一,其作用是在一個或多個文件中查找某個字符模式所在的行,并將結(jié)果輸出到屏幕上 grep 以行為單位進(jìn)行處理,不會對輸入文件本身進(jìn)行修改q grep 家族由 grep、egrep 和 fgrep 組成:u grep

34、: 標(biāo)準(zhǔn) grep 命令,本文主要討論此命令。u egrep: 擴(kuò)展 grep,支持基本及擴(kuò)展的正則表達(dá)式。u fgrep: 固定 grep (fixed grep),按字面解釋所有的字符,即正則表達(dá)式中的元字符不會被特殊處理。字符查找工具grep(續(xù)1)q grep 命令的一般形式:grep 選項 pattern file1 file2 .grep -f patternfile file1 file2 .l pattern:可以是正則表達(dá)式(用單引號括起來)、 或字符串(加雙引號)、或一個單詞。l file1 file2 . :文件名列表,作為 grep 命令的輸入;grep 的輸入也可以來

35、自標(biāo)準(zhǔn)輸入或管道;q 可以把匹配模式寫入到一個文件中,每行寫一個,然后使用 -f 選項,將該匹配模式傳遞給 grep 命令字符查找工具grep (續(xù)2)-c只輸出匹配的行的總數(shù)-i不區(qū)分大小寫-h查詢多個文件時,不顯示文件名-l查詢多個文件時,只輸出包含匹配模式的文件的文件名-n顯示匹配的行及行號-v反向查找,即只顯示不包含匹配模式的行-s不顯示錯誤信息grep -i an* datafilegrep 常用選項字符查找工具grep(舉例)查找包含字符串Hello的行g(shù)rep Hello datafile查找以#開頭的行g(shù)rep # datafile查找非空行并另存grep -v $ dataf

36、ile datefile2與管道符連用cat /etc/hosts | grep node | wc -l 字符流編輯工具sedsed 是一個精簡的、非交互式的編輯器q sed 是什么q sed 如何工作sed 逐行處理文件(或輸入),并將輸出結(jié)果發(fā)送到屏幕。即:sed 從輸入(可以是文件或其它標(biāo)準(zhǔn)輸入)中讀取一行,將之拷貝到一個編輯緩沖區(qū),按指定的 sed 編輯命令進(jìn)行處理,編輯完后將其發(fā)送到屏幕上,然后把這行從編輯緩沖區(qū)中刪除,讀取下面一行。重復(fù)此過程直到全部處理結(jié)束。sed 只是對文件在內(nèi)存中的副本進(jìn)行操作,所以 sed 不會修改輸入文件的內(nèi)容。sed 總是輸出到標(biāo)準(zhǔn)輸出,可以使用重定向

37、將 sed 的輸出保存到文件中。字符流編輯工具sed(續(xù)1)u sed的命令行調(diào)用方式sed -n-e sed_cmd input_filel -n:缺省情況下,sed 在將下一行讀入緩沖區(qū)之前,自動輸出行緩沖區(qū)中的內(nèi)容。此選項可以關(guān)閉自動輸出。l -e:允許調(diào)用多條 sed 命令,如:sed -e sed_cmd1 -e sed_cmd2 input_filel sed_cmd:使用格式: addresssed_edit_cmd (通常用單引號括起來),其中 address 為 sed 的行定位模式,用于指定將要被 sed 編輯的行。如果省略,sed 將編輯所有的行。sed_edit_cmd 為 sed 對被編輯行將要進(jìn)行的編輯操作。l input_file:sed 編輯的文件列表,若省略,sed 將從標(biāo)準(zhǔn)輸入(重定向或管道)中讀取輸入。字符流編輯工具sed (續(xù)2)sed 選項 -f sed_script_file

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論