課件16-27unix shell編程基礎(chǔ)培訓(xùn)_第1頁
課件16-27unix shell編程基礎(chǔ)培訓(xùn)_第2頁
課件16-27unix shell編程基礎(chǔ)培訓(xùn)_第3頁
課件16-27unix shell編程基礎(chǔ)培訓(xùn)_第4頁
課件16-27unix shell編程基礎(chǔ)培訓(xùn)_第5頁
已閱讀5頁,還剩114頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Unix Shell編程基礎(chǔ)培訓(xùn)北京頂測科技有限公司課程目標(biāo)熟練編寫Unix Shell程序 內(nèi)容提綱Shell介紹Shell腳本介紹Shell特性正則表達(dá)式變量與運(yùn)算符Shell的輸入與輸出條件測試控制流語句Shell函數(shù)腳本參數(shù)傳遞Shell-UNIX 命令解釋器問題引入: DOS系統(tǒng)的命令由command負(fù)責(zé)執(zhí)行,并且對重覆性或多個命令運(yùn)行可寫成批處理文件,只要執(zhí)行這個批處理文件就等於執(zhí)行這些命令。UNIX系統(tǒng)如何處理?Shell: shell是一種命令語言,同時又是一種程序設(shè)計語言。 UNIX系統(tǒng)利用shell命令解釋器(command-language interpreter) ,完

2、成用戶輸入命令的執(zhí)行,是用戶與系統(tǒng)交互的界面,是命令與kernel之間的接口。 shell接收用戶輸入的命令,對命令作出解釋,然后發(fā)送給kernel執(zhí)行之。 shell是一個解釋型的程序設(shè)計語言。 shell程序( 腳本)相當(dāng)于dos的批處理文件,可簡單到只有一條命令,也可以包括循環(huán)、條件語句、數(shù)學(xué)運(yùn)算、控制結(jié)構(gòu)的程序,完成復(fù)雜的管理任務(wù)。Shell-UNIX 命令解釋器Shell腳本介紹為什么使用Shell腳本?批量命令重復(fù)、條件等控制Shell腳本的基本內(nèi)容#!/bin/sh第一行注釋:#第二行變量第三行條件判斷、循環(huán)第四行腳本的運(yùn)行方式chmod ?+x 腳本./腳本文件名Shell腳本

3、介紹示例:hello.sh#!/bin/bash#這是一個基本的shell腳本op=hello worldecho $opShell特性別名命令替換管道重定向后臺處理模式匹配變量特殊字符別名aliasEg:alias ll=ls -alh命令替換myfile 的內(nèi)容如下:marm findfile實現(xiàn)替換如下:ls cat myfile -al后臺處理什么是后臺?一個終端可以同時運(yùn)行多個程序用法:nohup command &可以再后臺運(yùn)行此命令示例:nohub tar -czf 要壓縮的文件名 壓縮后的文件名 &查看后臺命令使用:jobs l 變量示例:#!/bin/bash#這是一個基本的

4、shell腳本printchar = “hello world”echo $printchar變量用來存儲信息管道( | )把一個命令的輸出連接到另一個命令的輸入。示例:ls | sortcat func.txt | grep -v #重定向( )與管道相關(guān),可以改變程序運(yùn)行的輸入來源和輸出地點示例:sort myfile.txt對文件中內(nèi)容進(jìn)行排序sort myfile_test.txt模式匹配顯示以txt為擴(kuò)展名的文件或顯示以a開頭的文件,這種情況稱為模式匹配。實現(xiàn)方式:正則表達(dá)式如:ls *.txt模式匹配: 正則表達(dá)式正則表達(dá)式在 shell、工具程序、Perl 語言中有非常重要的地位

5、。正則表達(dá)式通過一些特殊符號表示特定的字符串模式。常見的特殊字符包括:字符 功能 置于待搜索的字符串之前,匹配行首的字$ 置于待搜索的字符串之后,匹配行末的字 匹配一個字的字尾. 匹配任意單個正文字符str 匹配字符串 str 中的任意單個字符str 匹配不在字符串 str 中的任意單個字符a-c 匹配從 a 到 c 之間的任一字符* 匹配前一個字符的 0 次或多次出現(xiàn) 忽略特殊字符的特殊含義,將其看作普通字符模式匹配: 正則表達(dá)式擴(kuò)充的特殊字符:字符 功能+ 重復(fù)匹配前一項 1 次以上? 重復(fù)匹配前一項 0 次或 1 次j 重復(fù)匹配前一項 j 次j, 重復(fù)匹配前一項 j 次以上, k 重復(fù)匹

6、配前一項最多 k 次j, k 重復(fù)匹配前一項 j 到 k 次s | t 匹配 s 或 t 中的一項(exp) 將表達(dá)式 exp 作為單項處理基本元字符集元字符含義只匹配行首$只匹配行尾*匹配0或多個字符 匹配 內(nèi)字符屏蔽元字符的特殊含義.匹配任意單字符模式n匹配模式出現(xiàn)次數(shù),n模式n,m模式次數(shù),至少為n模式n,m模式出現(xiàn)在n,m之間模式匹配: 正則表達(dá)式匹配行首/行尾行首:行尾:$舉例查找當(dāng)前目錄下面所有子目錄ls l |grep “d”查找文本文件中,以a開頭的行more a.txt |grep “a”查找文本文件中,以a結(jié)尾的行more a.txt |grep “a$”查找文本文件中,所

7、有的空行more a.txt |grep “$”模式匹配: 正則表達(dá)式匹配單個字符模式:舉例.abc.可以匹配12abc34, ababc43等模式匹配: 正則表達(dá)式匹配0或多個字符模式:*舉例abc12*可以匹配如下abc123abc14248876abc11abc模式匹配: 正則表達(dá)式匹配單詞模式:功能:匹配完整的單詞舉例模式匹配: 正則表達(dá)式屏蔽特殊字符功能:將字符串中的特殊字符去掉特殊意義特殊字符$ . “ * | ( ) + ?舉例匹配包含.字符的行:.匹配包含$的行: $匹配包含的行:模式匹配: 正則表達(dá)式匹配范圍功能:匹配特定的字符串或字符串集舉例 或0-9:匹配任意數(shù)字A-Za

8、-z:匹配任意字母aa-zA-Zt:a開始任意字母thHello:匹配Hello或者h(yuǎn)ello0-9:匹配任一個非數(shù)字字符a-zA-Z:匹配任一個非字母字符模式匹配: 正則表達(dá)式匹配模式結(jié)果出現(xiàn)次數(shù)patternn匹配模式出現(xiàn)n次。patternn,匹配模式出現(xiàn)最少n次。patternn,m匹配模式出現(xiàn)n到m次之間,n , m為0 - 255中任意整數(shù)。模式匹配: 正則表達(dá)式舉 例A2BAABA4,BAAAAB, AAAAAB, AAAAAABA2,4BAAB,AAAB,AAAAB模式匹配: 正則表達(dá)式練習(xí)從如下文本中,選出日期格式符合yyyy.mm.dd的行2006-05-17 chenyq

9、20060711 suwn2006.07.19 aaa2005/11/25 bbb過濾模式:0-94.0-92.0-92模式匹配: 正則表達(dá)式特殊字符雙引號(“):用來使shell無法認(rèn)出空格、制表符和其他大多數(shù)特殊字符,這樣“David Medinets”表示一個值。單引號():用來使shell無法認(rèn)出所有特殊字符。反引號():用來替換命令。反斜杠():用來使shell無法認(rèn)出以上的特殊字符,使其后的特殊字符失去特殊含義。如:David Medinetsrootsky /root# touch David Medinetsrootsky /root# ls David medinets特殊字

10、符分號(;):允許在一行上放多個命令。Eg:mv a.txt b ; mv d.txt e&:命令后執(zhí)行。括號():創(chuàng)建成組的命令。大括號 :創(chuàng)建命令塊。豎桿(|):管道標(biāo)示符。 &:表示重定向。* ? !:表示模式匹配。$:變量名的開頭。#:表示注釋(第一行除外)??崭?,制表符,換行符:當(dāng)做空白。變量與運(yùn)算符本地變量環(huán)境變量變量替換位置變量標(biāo)準(zhǔn)變量特殊變量影響變量的命令引號運(yùn)算符表達(dá)式替換運(yùn)算符優(yōu)先級變 量什么是shell變量本地變量環(huán)境變量變量替換位置變量標(biāo)準(zhǔn)變量特殊變量影響變量的命令本地變量本地變量在用戶現(xiàn)在的shell生命期的腳本中存在使用。variable-name=value設(shè)置變

11、量及值set 顯示本地所有的變量readonly variable-name變量只讀設(shè)置后不能在設(shè)置回來了。本地變量(續(xù))rootjack /root# LOCALTEST=“test”rootjack /root# echo $LOCALTESTtestrootjack /root# readonly LOCALTESTrootjack /root# LOCALTEST=“test1”Bash:LOCALTEST: readonly variablerootjack /root# readonly -p查看當(dāng)前設(shè)置的本地變量Declare r LOCALTEST=“test”Declare

12、ir UID=“0”示例:環(huán)境變量用于所有用戶進(jìn)程(稱為子進(jìn)程)。登錄進(jìn)程稱為父進(jìn)程。Shell中執(zhí)行的用戶進(jìn)程均稱為子進(jìn)程。不像本地變量(只用于當(dāng)前的shell),環(huán)境變量可用于所有子進(jìn)程,包括編輯器、腳本和各種應(yīng)用程序。$HOME/.bash_profile(/etc/profile)export用于設(shè)置環(huán)境變量env查看環(huán)境變量eg:export SITECH=“BeiJing”readonly SITECH設(shè)置只讀環(huán)境變量如果使用了readonly命令的話,變量就不可以被修改或清除了。示例如下: $ export TEST=Test. #增加一個環(huán)境變量TEST$ readonly T

13、EST #將環(huán)境變量TEST設(shè)為只讀$ unset TEST #會發(fā)現(xiàn)此變量不能被刪除-bash: unset: TEST: cannot unset: readonly variable$ TEST=New #會發(fā)現(xiàn)此也變量不能被修改-bash: TEST: readonly variable環(huán)境變量用C程序來訪問和設(shè)置環(huán)境變量 使用下列三個函數(shù)來設(shè)置或訪問一個環(huán)境變量。 getenv()訪問一個環(huán)境變量。輸入?yún)?shù)是需要訪問的變量名字,返回值是一個字符串。如果所訪問的環(huán)境變量不存在,則會返回NULL。 setenv()在程序里面設(shè)置某個環(huán)境變量的函數(shù)。 unsetenv()清除某個特定的環(huán)境

14、變量的函數(shù)。 有一個指針變量environ,它指向的是包含所有的環(huán)境變量的一個列表。下面的程序可以打印出當(dāng)前運(yùn)行環(huán)境里面的所有環(huán)境變量: #include extern char*environ;int main ()char*var;for (var =environ;*var !=NULL;+var)printf (%s n ,*var);return 0;還可以通過修改一些相關(guān)的環(huán)境定義文件來修改環(huán)境變量,比如對于Red Hat等Linux發(fā)行版本,與環(huán)境相關(guān)的文件有/etc/profile和/.bashrc等。修改完畢后重新登錄一次就生效了。 變量替換用變量的值替換它的名字。Echo在

15、變量名前加$,使用echo命令可以顯示單個變量取值。例如:rootjack /root# testvar=“this is a test”rootjack /root# echo $testvarthis is a test變量替換(續(xù))1.echo $variable name顯示實際值到variable name中2.echo $variable name:+value如果設(shè)置了variable name,則顯示其值value,否則顯示為空。3.echo $variable name:?value如果未設(shè)置variable name,則顯示用戶自定義的錯誤信息value。4.echo $v

16、ariable name:-value如果未設(shè)置variable name,則顯示其值value。否則顯示原來值。5.echo $variable name:=value如果未設(shè)置variable name,設(shè)置其值為value,并顯示。變量替換(續(xù))Unset刪除環(huán)境變量Unset variable-name例如:rootjack /root# testvar=“this is a test”rootjack /root# echo $testvarThis is a testrootjack /root# unset testvarrootjack /root# echo $testvar

17、rootjack /root# 如果是readonly 的變量是不能進(jìn)行取消刪除的。位置變量位置變量表示形式:$0,$1,$2$9向腳本中使用位置參數(shù)向系統(tǒng)命令傳遞參數(shù)$0$1$2$03$04$5$6$7$8$9腳本名字ABCDEF標(biāo)準(zhǔn)變量bash默認(rèn)建立了一些標(biāo)準(zhǔn)環(huán)境變量,可在/etc/profile中定義。EXINITHOMEecho $HOME IFSLOGNAMEecho $LOGNAME 獲取當(dāng)前登錄名set | grep LOG 與之功能等價MAILset | grep MAIL MAIL=/usr/spool/mail/account存放郵箱位置MAILCHECK=600每隔60

18、0秒掃描郵箱一次MAILMSG=YOU HAVE NEW MAIL郵箱信息MAILCHECK標(biāo)準(zhǔn)變量MAILPATHPATH eg: set | grep PATH 取得環(huán)境路徑PS1 eg: set | grep PS 改變命令提示符信息PS2SHELL eg: set | grep SHELL 取得當(dāng)前SHELL信息TERMINFO eg: set | grep TERMINFO TERM eg: set | grep TERM 顯示終端類型TZ eg: set | grep TZ 表示時區(qū)EDITORPWD eg: set | grep PWD 取得當(dāng)前目錄信息MANPATH eg: s

19、et | grep MANPATH 特殊變量$#: (傳遞到腳本的參數(shù)個數(shù))$*: (以一個單字符串顯示所有向腳本傳遞的參數(shù),與位置變量不同,此選項參數(shù)可超過9個)$: (腳本運(yùn)行的當(dāng)前進(jìn)程 ID號)$!: (后臺運(yùn)行的最后一個進(jìn)程的進(jìn)程ID)$: (與$#相同,但是使用時加上引號,并在引號中返回每個參數(shù))$-: (顯示shell使用的當(dāng)前選項,與set命令功能相同)$?: (顯示最后命令的退出狀態(tài)。0表示沒有錯誤,其它任何值表示有錯誤)影響變量的命令readonly用于顯示或設(shè)置只讀變量- 表明選項結(jié)束-f 創(chuàng)建只讀變量set設(shè)置或重設(shè)各種shell影響變量的命令unset用于取消變量的定義

20、- 表明選項結(jié)束-f 刪除只讀變量,但不能取消從shell環(huán)境中刪除指定的變量和函數(shù)。如: PATH,PS1,PS2,PPID,UID,EUID 等的設(shè)置。運(yùn)算符運(yùn)算符類型位運(yùn)算符, , &, |, $ 表示對方括號中的表達(dá)式進(jìn)行求值$24例如:#!/bin/bash# $ 表示舉例echo $2+8運(yùn)算符位運(yùn)算符運(yùn)算符說明op1反運(yùn)算符,把op1中所有的二進(jìn)制位的1變?yōu)?,0變?yōu)?。op1op2右移運(yùn)算符,把op1中的二進(jìn)制位向右移動op2位,忽略最右端移出的各位,最左端的各位補(bǔ)上0值,每做一次按位右移就有實現(xiàn)op1除以2op1&op2與比較運(yùn)算符,比較op1和op2對應(yīng)位,對于每個二進(jìn)制位

21、來說,如果二者該位都是1,則結(jié)果為1;否則,結(jié)果為0。op1op2異或比較運(yùn)算符,比較op1和op2對應(yīng)位,對于每個二進(jìn)制位來說,如果二者該位互補(bǔ),則結(jié)果為1;否則,結(jié)果為0。op1 | op2或運(yùn)算符,比較op1和op2對應(yīng)位,對于每個二進(jìn)制位來說,如果二者該位有一個是1或者都是1,則結(jié)果為1;否則,結(jié)果為0。運(yùn)算符運(yùn)算符類型邏輯運(yùn)算符賦值運(yùn)算符運(yùn)算符說明&與運(yùn)算符|或運(yùn)算符,=,!=+=、-=、*=、/=、%=、&=、=、|=、=eg: var=65 let var+=4 echo $var/69表達(dá)式替換$ 和$ ( ( ) )習(xí)慣使用$ ,所有shell的求值都是用整數(shù)完成。$ 可以接

22、受不同基數(shù)的數(shù)字 base#n n表示基數(shù)從2到36的任何基數(shù)。eg: 八進(jìn)制的10加1,結(jié)果為9 echo $ 10#8+1 9運(yùn)算符優(yōu)先級級別運(yùn)算符說明級別運(yùn)算符說明13-,+正,負(fù)12!,邏輯非,按位取反或補(bǔ)碼11*,/,%乘,除,取模10+,-加,減9按位左移,按位右移8=,7=,!=等于,不等于6&按位與5按位異或4|按位或3&邏輯與2|邏輯或1=,+=,-=,*=,/=,%=,=,=,&=賦值、運(yùn)算且賦值較高運(yùn)算級別的運(yùn)算符優(yōu)先于低級別的運(yùn)算符進(jìn)行求值運(yùn)算。小結(jié)本地變量環(huán)境變量變量替換位置變量標(biāo)準(zhǔn)變量特殊變量影響變量的命令引號運(yùn)算符表達(dá)式替換運(yùn)算符優(yōu)先級Shell 輸入、輸出控制e

23、choreadcat管道tee文件重定向echoecho顯示文本或變量,或者把字符串輸入到文件命令格式echo string-e 表示解析轉(zhuǎn)義字符 -n 回車不換行,linux默認(rèn)回車換行控制字符:c-不換行;t-跳格;n-換行舉例echo “Whats your nname:c”read nameecho $LOGNAMEecho 舉例示例:#!/bin/bash#echodecho e “This echos 3 new linesnnnn”echo “OK”echoecho “This echos 3 new linesnnnn”echo “The log files have all

24、been done” mylogfile.txtreadread從鍵盤或文件的某一行文本中讀入信息,并將其賦給一個變量命令格式read 變量1 變量2 舉例$read name1 name2tom jerry bobread 舉例示例:#!/bin/bash#readnameecho n “First Name”read firstnameecho n “Last Name:”read lastnameecho e “Your First Name is : $firstname n”echo e “Your Last Name is : $lastname n”文件重定向標(biāo)準(zhǔn)輸出、輸入及錯誤

25、文件文件描述符輸入文件標(biāo)準(zhǔn)輸入0(缺省是鍵盤,也可以是文件或其他命令的輸出)輸出文件標(biāo)準(zhǔn)輸出1(缺省是屏幕,也可以是文件)錯誤輸出文件標(biāo)準(zhǔn)錯誤2(缺省是屏幕,也可以是文件) 在shell 中執(zhí)行命令時,每個進(jìn)程都和三個打開的文件相關(guān)聯(lián),并使用文件描述符來引用這些文件。由于文件描述符不容易記憶,shell同時也給出了相應(yīng)的文件名。文件重定向改變程序運(yùn)行的輸入來源和輸出地點1. command filename把標(biāo)準(zhǔn)輸出重定向到一個新文件中2. command filename把標(biāo)準(zhǔn)輸出重定向到一個文件中(追加)3. command 1 filename把標(biāo)準(zhǔn)輸出重定向到一個文件中4. comma

26、nd filename2 &1 把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤一起重定向到一個文件中5. command2 filename把標(biāo)準(zhǔn)錯誤重定向到一個文件中6. command2 filename把標(biāo)準(zhǔn)輸出重定向到一個文件中(追加)文件重定向改變程序運(yùn)行的輸入來源和輸出地點7. Command filename 2 &1把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤一起重定向到一個文件中(追加)8. Command filename 2command命令以filename文件作為標(biāo)準(zhǔn)輸入,以filename 2文件作為標(biāo)準(zhǔn)輸出9. Command delimiter 從標(biāo)準(zhǔn)輸入中讀入,直至遇到delimiter分界符10. Comm

27、and &m把標(biāo)準(zhǔn)輸出重定向到文件描述符m中12. Command2 sort.out第3種情況cat file | sort sort.out第1種情況pwd path.out第2種情況 nullfile.txt創(chuàng)建一個文件重定向標(biāo)準(zhǔn)輸入示例sort file將file文件中的數(shù)據(jù)作為輸入,sort對其進(jìn)行排序,然后將排序后的結(jié)果輸出到屏幕上sort name.out第8種情況對排序后的內(nèi)容輸出到name.out文件中文件重定向舉例標(biāo)準(zhǔn)輸入示例:第9種情況rootjack shell# cat term.txt Hello,there I am using a $TERM !and my u

28、sername is $LOGNAMEbyeSITECHrootjack shell# cat term.txtHello,there I am using a vt100 !and my username is rootbye文件重定向舉例重定向標(biāo)準(zhǔn)錯誤示例:rootjack shell# grep “trd” book.txtGrep: missiles:No such file or directoryrootjack shell# grep “trd” book.txt 2 /dev/null解釋:表示把錯誤信息扔給/dev/null , /dev/null 不會保存錯誤信息,實質(zhì)就是

29、丟失錯誤信息。如果sky.txt不存在,則錯誤信息存入到一個指定的文件中,如:ls -al sky.txt 2 err_message.txt文件重定向舉例結(jié)合使用標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯誤示例:rootjack shell# cat account_new.txt Account_old.txt 1 accounts.out 2 accounts.errrootjack shell# cat accounts.out?rootjack shell# cat accounts.err?將2個文件的內(nèi)容重定向到accounts.out中,如果某一個文件不存在,或出錯,則將錯誤信息重定向到錯誤文件中acc

30、ounts.err文件重定向舉例合并標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯誤示例:合并的時候shell是從左到右分析相應(yīng)命令grep “standard” standard.txt grep.out 2&1-如果文件不存在,則把錯誤信息記錄到grep.out中-如果文件存在, 也把正確的信息記錄到grep.out中練習(xí)重定向標(biāo)準(zhǔn)輸出ls l ls.outls l ls.out重定向標(biāo)準(zhǔn)輸入sort /dev/null組合重定向find . name “*.log” find.log 2&1小 結(jié)echoreadcat管道重點掌握tee文件重定向重點掌握條件測試shell的內(nèi)部命令里面有測試條件的語法test給if

31、while用 test condition或者 condition 條件測試文件狀態(tài)測試邏輯操作符字符串測試數(shù)值測試expr文件狀態(tài)測試格式:test 狀態(tài) 或 狀態(tài)舉例test w student.txtecho $? -x student.txt echo $? -e file 文件存在 -d /etc/ 目錄存在 -s file 文件大小大于0 -r file 文件可讀 -b file 區(qū)塊文件 -c file 字符文件 -f file 一般文件 -w file 文件可寫 -x file 文件可執(zhí)行 -k file 設(shè)定了限定位 -g file 設(shè)定了組位 -u file 設(shè)定了user

32、 id -p file 管線字符串測試命令格式 操作符 字符串 字符串 操作符 字符串 舉例 -z $EDITOR $EDITOR = “vi” 操作符含義=相等!=不等-z空串-n非空串?dāng)?shù)值測試命令格式”數(shù)字1“ 操作符 ”數(shù)字2“ ”數(shù)字1“ 操作符 “數(shù)字2” 舉例 ”100“ lt “110” echo $?$NUMBER=100 “$NUMBER ge 110 echo $? 900 -le 901 -a 100 -gt 99 echo $?操作符含義-eq等于-ne不等于-gt大于-lt小于-le小于等于-ge大于等于邏輯操作符邏輯操作符-a 邏輯與-o 邏輯或! 邏輯否舉例 -x

33、 student -a -w student echo $?expr命令格式expr 參數(shù) 操作符 參數(shù)增量計數(shù)LOOP=0LOOP=expr $LOOP + 1數(shù)值測試模式匹配條件測試小結(jié)文件狀態(tài)測試邏輯操作符字符串測試數(shù)值測試expr控制流結(jié)構(gòu)流控制if then else:條件測試case:匹配模式、單詞或值循環(huán)for 循環(huán)until循環(huán)while循環(huán)if then else語句語法格式:if 條件1then 命令1elif 條件2then 命令2else 命令3fi示例:if 10 -lt 11 then echo 10 is less than 11fiif then else語句#

34、!/bin/sh#if samples 2echo -n Enter your name:read NAMEif $NAME = | -z $NAME then echo sorry, you did not enter a nameelse echo you entered $NAMEfi示例:#!/bin/sh#ifcpif cp myfile.bak myfile; then echo “good copyelse echo “basename $0: error could not copy the files” &2fiif then else語句#!/bin/sh#ifelifec

35、ho -n Enter your name:read NAMEif $NAME = | -z $NAME ; then echo “You did not enter a name.“elif $NAME = “root ; echo “Hello root.“elif $NAME = “jack ; echo “Hello jack.“else echo you are not or jack,but hi, $NAME”fi示例:case語句語法格式:case 值 in 模式1)命令1;模式2)命令2;esac模式匹配:* 表示任意字符? 表示任意單個字符 abc a、b 或 c 三字符其

36、中之一 a-n 從a到n的任一字符 | 多重選擇 case語句#!/bin/sh#case test 1echo -n enter a number between 1 and 3 pls.:read NUMcase NUM in 1) echo you entered 1 ; 2) echo you entered 2 ; 3) echo you entered 3 ;Y|y) echo “you entered $NUM” ; *) echo basename $0 exit 1 ;esac示例:for循環(huán)語法格式:for 變量名 in 列表do命令1命令2donefor循環(huán)#!/bin/

37、sh#for test 1for loop in 1 2 3 4 5do echo $loopdone示例:#!/bin/sh#for test 2for loop in “is this your pen?”do echo $loopdone列表換為:is this your pen?或cat myfilefor循環(huán)#!/bin/sh#for test 3BAK=.bakfor loop in lsdo echo backup $loop to $loop$BAK cp $loop $loop$BAKdone示例:for循環(huán)#!/bin/sh#for test 4counter=0for f

38、iles in *do counter=expr $counter + 1doneecho There are $counter files in pwd示例:for循環(huán)將.foo后綴的文件批量改名為.bar后綴。for f in *.foo; do base = basename $f .foo mv $f $base.bardone示例:將大寫文件名改為小寫文件名。for f in *; do mv $f echo $f | tr A-Z a-zdoneuntil循環(huán)語法until 條件命令1命令2done示例:#!/bin/sh#until test 2counter=0echo $co

39、unteruntil $counter -ge 100 do counter=expr $counter + 1 echo $counterdone條件發(fā)生在循環(huán)末尾,至少執(zhí)行一次循環(huán)until循環(huán)示例:#!/bin/sh#until_monpart = “/backup” #得到磁盤使用的百分比LOOK_OUT=df |grep $part | awk print $5 | sed s/%/g echo $ LOOK_OUTuntil $ LOOK_OUT -gt “90 doecho “文件備份已經(jīng)快滿了!” | mail root LOOK_OUT=df |grep $part | aw

40、k print $5 | sed s/%/g sleep 3600donenohup ./文件名.sh后臺運(yùn)行程序休息3600秒while 循環(huán)語法格式:while 條件do命令1命令2donewhile循環(huán)#!/bin/sh#while test 1counter=0echo $counterwhile $counter -lt 100 do counter=expr $counter + 1 echo $counterdone示例1:while循環(huán)#!/bin/sh#while test 2while read LINEdo echo $LINEdone a.sh示例2:表示從a.sh文件

41、中一行行讀出數(shù)據(jù)到LINE中,循環(huán)輸出while循環(huán)yymm=200810no=10low=0con_db=dbaccopr/accoprdb152ACCDBtab_name=all_owedet_tmpsrc=dcustowesqlplus -s $con_db !drop table $tab_name;create table $tab_name (); while $no -lt 100 do if $no -lt 10 then sqlplus -s $con_db! insert into $tab_name select 字段,. from $src$yymm$low$no; c

42、ommit; elif $no -lt 100 then insert into $tab_name select contract_no,id_no,fee_code,detail_code,cust_id,payed_status, should_pay should ,favour_fee favour,payed_prepay from $src$yymm$no; fi no=expr $no + 1 doneexit!示例3while循環(huán)yymm=200810num=10low=0con_db=dbaccopr/accoprdb152ACCDBtab_name=all_owedet_

43、tmpsrc=dcustowesqlplus -s $con_db ! while $num -lt 100 do echo $num; insert into $tab_name select contract_no,id_no,fee_code,detail_code,cust_id,payed_status, should_pay should ,favour_fee favour,payed_prepay from $src$yymm$num; commit; num=expr $num + 1 doneexit!示例4:循環(huán)控制break跳出循環(huán)continue不會跳出循環(huán),跳過本次

44、循環(huán),進(jìn)入下一次循環(huán)循環(huán)控制舉例示例:#!/bin/sh#breakoutwhile :do echo n “Enter any number 15:”read ANScase $ANS in1|2|3|4|5)echo “您鍵入正確的數(shù)字.”;*)echo “錯誤的輸入”break;esacdone:表示永遠(yuǎn)為真循環(huán)控制舉例示例:#!/bin/sh#breakoutwhile :do echo n “Enter any number 15:”read ANScase $ANS in1|2|3|4|5)echo “您鍵入正確的數(shù)字.”;*)echo “錯誤的輸入,是否繼續(xù)(y/n)?”read

45、 IS_CONTINUEcase $IS_CONTINUE iny|yes|Y|YES)continue;*)break;esacesacdoneSHELL實例 設(shè)計一個Shell程序,在/userdata目錄下建立50個目錄,即user1user50,并設(shè)置每個目錄的權(quán)限,其中其他用戶的權(quán)限為:讀;文件所有者的權(quán)限為:讀、寫、執(zhí)行;文件所有者所在組的權(quán)限為:讀、執(zhí)行。 考答案: 建立程序 如下:#!/bin/shi=1while i -le 50 doif -d /userdata ;thenmkdir -p /userdata/user$ichmod 754 /userdata/user$

46、iecho user$ilet i = i + 1 (或i=$($i1)elsemkdir /userdatamkdir -p /userdata/user$ichmod 754 /userdata/user$iecho user$ilet i = i + 1 (或i=$($i1)fidone練習(xí)編寫一個菜單界面1:顯示當(dāng)前目錄下所有文件2:顯示當(dāng)前目錄下所有文件大小3:使用vi編輯器4:查看當(dāng)前系統(tǒng)中登陸的用戶q:退出菜單控制流結(jié)構(gòu)小結(jié)流控制if then else:條件測試case:匹配模式、單詞或值循環(huán)for 循環(huán)until循環(huán)while循環(huán)循環(huán)控制breakcontinueshell函

47、數(shù)函數(shù)定義參數(shù)傳遞函數(shù)文件檢查載入和刪除函數(shù)函數(shù)的返回函數(shù)定義情況一:函數(shù)名() 命令1 命令2 情況二:function 函數(shù)名() 命令1 命令2 函數(shù)定義#!/bin/sh#funcfunction hello() echo “你好,今天是:date”echo “=“helloecho “=“示例1 :函數(shù)定義#!/bin/shdisksum() echo ls -l | awk /d/ total+=$5 END print Total size is:totaldisksum示例2 :函數(shù)定義#!/bin/shdisksum() echo ls -l | awk /d/ total+=$5 END print Total size is:totaldisksum示例:參數(shù)傳遞#!/bin/sh#fun

溫馨提示

  • 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

提交評論