版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Unix Shell編程基礎(chǔ)培訓(xùn)北京頂測(cè)科技有限公司課程目標(biāo)熟練編寫(xiě)Unix Shell程序 內(nèi)容提綱Shell介紹Shell腳本介紹Shell特性正則表達(dá)式變量與運(yùn)算符Shell的輸入與輸出條件測(cè)試控制流語(yǔ)句Shell函數(shù)腳本參數(shù)傳遞Shell-UNIX 命令解釋器問(wèn)題引入: DOS系統(tǒng)的命令由command負(fù)責(zé)執(zhí)行,并且對(duì)重覆性或多個(gè)命令運(yùn)行可寫(xiě)成批處理文件,只要執(zhí)行這個(gè)批處理文件就等於執(zhí)行這些命令。UNIX系統(tǒng)如何處理?Shell: shell是一種命令語(yǔ)言,同時(shí)又是一種程序設(shè)計(jì)語(yǔ)言。 UNIX系統(tǒng)利用shell命令解釋器(command-language interpreter) ,完
2、成用戶(hù)輸入命令的執(zhí)行,是用戶(hù)與系統(tǒng)交互的界面,是命令與kernel之間的接口。 shell接收用戶(hù)輸入的命令,對(duì)命令作出解釋?zhuān)缓蟀l(fā)送給kernel執(zhí)行之。 shell是一個(gè)解釋型的程序設(shè)計(jì)語(yǔ)言。 shell程序( 腳本)相當(dāng)于dos的批處理文件,可簡(jiǎn)單到只有一條命令,也可以包括循環(huán)、條件語(yǔ)句、數(shù)學(xué)運(yùn)算、控制結(jié)構(gòu)的程序,完成復(fù)雜的管理任務(wù)。Shell-UNIX 命令解釋器Shell腳本介紹為什么使用Shell腳本?批量命令重復(fù)、條件等控制Shell腳本的基本內(nèi)容#!/bin/sh第一行注釋?zhuān)?第二行變量第三行條件判斷、循環(huán)第四行腳本的運(yùn)行方式chmod ?+x 腳本./腳本文件名Shell腳本
3、介紹示例:hello.sh#!/bin/bash#這是一個(gè)基本的shell腳本op=hello worldecho $opShell特性別名命令替換管道重定向后臺(tái)處理模式匹配變量特殊字符別名aliasEg:alias ll=ls -alh命令替換myfile 的內(nèi)容如下:marm findfile實(shí)現(xiàn)替換如下:ls cat myfile -al后臺(tái)處理什么是后臺(tái)?一個(gè)終端可以同時(shí)運(yùn)行多個(gè)程序用法:nohup command &可以再后臺(tái)運(yùn)行此命令示例:nohub tar -czf 要壓縮的文件名 壓縮后的文件名 &查看后臺(tái)命令使用:jobs l 變量示例:#!/bin/bash#這是一個(gè)基本的
4、shell腳本printchar = “hello world”echo $printchar變量用來(lái)存儲(chǔ)信息管道( | )把一個(gè)命令的輸出連接到另一個(gè)命令的輸入。示例:ls | sortcat func.txt | grep -v #重定向( )與管道相關(guān),可以改變程序運(yùn)行的輸入來(lái)源和輸出地點(diǎn)示例:sort myfile.txt對(duì)文件中內(nèi)容進(jìn)行排序sort myfile_test.txt模式匹配顯示以txt為擴(kuò)展名的文件或顯示以a開(kāi)頭的文件,這種情況稱(chēng)為模式匹配。實(shí)現(xiàn)方式:正則表達(dá)式如:ls *.txt模式匹配: 正則表達(dá)式正則表達(dá)式在 shell、工具程序、Perl 語(yǔ)言中有非常重要的地位
5、。正則表達(dá)式通過(guò)一些特殊符號(hào)表示特定的字符串模式。常見(jiàn)的特殊字符包括:字符 功能 置于待搜索的字符串之前,匹配行首的字$ 置于待搜索的字符串之后,匹配行末的字 匹配一個(gè)字的字尾. 匹配任意單個(gè)正文字符str 匹配字符串 str 中的任意單個(gè)字符str 匹配不在字符串 str 中的任意單個(gè)字符a-c 匹配從 a 到 c 之間的任一字符* 匹配前一個(gè)字符的 0 次或多次出現(xiàn) 忽略特殊字符的特殊含義,將其看作普通字符模式匹配: 正則表達(dá)式擴(kuò)充的特殊字符:字符 功能+ 重復(fù)匹配前一項(xiàng) 1 次以上? 重復(fù)匹配前一項(xiàng) 0 次或 1 次j 重復(fù)匹配前一項(xiàng) j 次j, 重復(fù)匹配前一項(xiàng) j 次以上, k 重復(fù)匹
6、配前一項(xiàng)最多 k 次j, k 重復(fù)匹配前一項(xiàng) j 到 k 次s | t 匹配 s 或 t 中的一項(xiàng)(exp) 將表達(dá)式 exp 作為單項(xiàng)處理基本元字符集元字符含義只匹配行首$只匹配行尾*匹配0或多個(gè)字符 匹配 內(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開(kāi)頭的行more a.txt |grep “a”查找文本文件中,以a結(jié)尾的行more a.txt |grep “a$”查找文本文件中,所
7、有的空行more a.txt |grep “$”模式匹配: 正則表達(dá)式匹配單個(gè)字符模式:舉例.abc.可以匹配12abc34, ababc43等模式匹配: 正則表達(dá)式匹配0或多個(gè)字符模式:*舉例abc12*可以匹配如下abc123abc14248876abc11abc模式匹配: 正則表達(dá)式匹配單詞模式:功能:匹配完整的單詞舉例模式匹配: 正則表達(dá)式屏蔽特殊字符功能:將字符串中的特殊字符去掉特殊意義特殊字符$ . “ * | ( ) + ?舉例匹配包含.字符的行:.匹配包含$的行: $匹配包含的行:模式匹配: 正則表達(dá)式匹配范圍功能:匹配特定的字符串或字符串集舉例 或0-9:匹配任意數(shù)字A-Za
8、-z:匹配任意字母aa-zA-Zt:a開(kāi)始任意字母thHello:匹配Hello或者h(yuǎn)ello0-9:匹配任一個(gè)非數(shù)字字符a-zA-Z:匹配任一個(gè)非字母字符模式匹配: 正則表達(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過(guò)濾模式:0-94.0-92.0-92模式匹配: 正則表達(dá)式特殊字符雙引號(hào)(“):用來(lái)使shell無(wú)法認(rèn)出空格、制表符和其他大多數(shù)特殊字符,這樣“David Medinets”表示一個(gè)值。單引號(hào)():用來(lái)使shell無(wú)法認(rèn)出所有特殊字符。反引號(hào)():用來(lái)替換命令。反斜杠():用來(lái)使shell無(wú)法認(rèn)出以上的特殊字符,使其后的特殊字符失去特殊含義。如:David Medinetsrootsky /root# touch David Medinetsrootsky /root# ls David medinets特殊字
10、符分號(hào)(;):允許在一行上放多個(gè)命令。Eg:mv a.txt b ; mv d.txt e&:命令后執(zhí)行。括號(hào)():創(chuàng)建成組的命令。大括號(hào) :創(chuàng)建命令塊。豎桿(|):管道標(biāo)示符。 &:表示重定向。* ? !:表示模式匹配。$:變量名的開(kāi)頭。#:表示注釋?zhuān)ǖ谝恍谐猓???崭?,制表符,換行符:當(dāng)做空白。變量與運(yùn)算符本地變量環(huán)境變量變量替換位置變量標(biāo)準(zhǔn)變量特殊變量影響變量的命令引號(hào)運(yùn)算符表達(dá)式替換運(yùn)算符優(yōu)先級(jí)變 量什么是shell變量本地變量環(huán)境變量變量替換位置變量標(biāo)準(zhǔn)變量特殊變量影響變量的命令本地變量本地變量在用戶(hù)現(xiàn)在的shell生命期的腳本中存在使用。variable-name=value設(shè)置變
11、量及值set 顯示本地所有的變量readonly variable-name變量只讀設(shè)置后不能在設(shè)置回來(lái)了。本地變量(續(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)境變量用于所有用戶(hù)進(jìn)程(稱(chēng)為子進(jìn)程)。登錄進(jìn)程稱(chēng)為父進(jìn)程。Shell中執(zhí)行的用戶(hù)進(jìn)程均稱(chēng)為子進(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命令的話(huà),變量就不可以被修改或清除了。示例如下: $ export TEST=Test. #增加一個(gè)環(huán)境變量TEST$ readonly T
13、EST #將環(huán)境變量TEST設(shè)為只讀$ unset TEST #會(huì)發(fā)現(xiàn)此變量不能被刪除-bash: unset: TEST: cannot unset: readonly variable$ TEST=New #會(huì)發(fā)現(xiàn)此也變量不能被修改-bash: TEST: readonly variable環(huán)境變量用C程序來(lái)訪(fǎng)問(wèn)和設(shè)置環(huán)境變量 使用下列三個(gè)函數(shù)來(lái)設(shè)置或訪(fǎng)問(wèn)一個(gè)環(huán)境變量。 getenv()訪(fǎng)問(wèn)一個(gè)環(huán)境變量。輸入?yún)?shù)是需要訪(fǎng)問(wèn)的變量名字,返回值是一個(gè)字符串。如果所訪(fǎng)問(wèn)的環(huán)境變量不存在,則會(huì)返回NULL。 setenv()在程序里面設(shè)置某個(gè)環(huán)境變量的函數(shù)。 unsetenv()清除某個(gè)特定的環(huán)境
14、變量的函數(shù)。 有一個(gè)指針變量environ,它指向的是包含所有的環(huán)境變量的一個(gè)列表。下面的程序可以打印出當(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ò)修改一些相關(guān)的環(huán)境定義文件來(lái)修改環(huán)境變量,比如對(duì)于Red Hat等Linux發(fā)行版本,與環(huán)境相關(guān)的文件有/etc/profile和/.bashrc等。修改完畢后重新登錄一次就生效了。 變量替換用變量的值替換它的名字。Echo在
15、變量名前加$,使用echo命令可以顯示單個(gè)變量取值。例如:rootjack /root# testvar=“this is a test”rootjack /root# echo $testvarthis is a test變量替換(續(xù))1.echo $variable name顯示實(shí)際值到variable name中2.echo $variable name:+value如果設(shè)置了variable name,則顯示其值value,否則顯示為空。3.echo $variable name:?value如果未設(shè)置variable name,則顯示用戶(hù)自定義的錯(cuò)誤信息value。4.echo $v
16、ariable name:-value如果未設(shè)置variable name,則顯示其值value。否則顯示原來(lái)值。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 與之功能等價(jià)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 顯示終端類(lèi)型TZ eg: set | grep TZ 表示時(shí)區(qū)EDITORPWD eg: set | grep PWD 取得當(dāng)前目錄信息MANPATH eg: s
19、et | grep MANPATH 特殊變量$#: (傳遞到腳本的參數(shù)個(gè)數(shù))$*: (以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù),與位置變量不同,此選項(xiàng)參數(shù)可超過(guò)9個(gè))$: (腳本運(yùn)行的當(dāng)前進(jìn)程 ID號(hào))$!: (后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程ID)$: (與$#相同,但是使用時(shí)加上引號(hào),并在引號(hào)中返回每個(gè)參數(shù))$-: (顯示shell使用的當(dāng)前選項(xiàng),與set命令功能相同)$?: (顯示最后命令的退出狀態(tài)。0表示沒(méi)有錯(cuò)誤,其它任何值表示有錯(cuò)誤)影響變量的命令readonly用于顯示或設(shè)置只讀變量- 表明選項(xiàng)結(jié)束-f 創(chuàng)建只讀變量set設(shè)置或重設(shè)各種shell影響變量的命令unset用于取消變量的定義
20、- 表明選項(xiàng)結(jié)束-f 刪除只讀變量,但不能取消從shell環(huán)境中刪除指定的變量和函數(shù)。如: PATH,PS1,PS2,PPID,UID,EUID 等的設(shè)置。運(yùn)算符運(yùn)算符類(lèi)型位運(yùn)算符, , &, |, $ 表示對(duì)方括號(hào)中的表達(dá)式進(jìn)行求值$24例如:#!/bin/bash# $ 表示舉例echo $2+8運(yùn)算符位運(yùn)算符運(yùn)算符說(shuō)明op1反運(yùn)算符,把op1中所有的二進(jìn)制位的1變?yōu)?,0變?yōu)?。op1op2右移運(yùn)算符,把op1中的二進(jìn)制位向右移動(dòng)op2位,忽略最右端移出的各位,最左端的各位補(bǔ)上0值,每做一次按位右移就有實(shí)現(xiàn)op1除以2op1&op2與比較運(yùn)算符,比較op1和op2對(duì)應(yīng)位,對(duì)于每個(gè)二進(jìn)制位
21、來(lái)說(shuō),如果二者該位都是1,則結(jié)果為1;否則,結(jié)果為0。op1op2異或比較運(yùn)算符,比較op1和op2對(duì)應(yīng)位,對(duì)于每個(gè)二進(jìn)制位來(lái)說(shuō),如果二者該位互補(bǔ),則結(jié)果為1;否則,結(jié)果為0。op1 | op2或運(yùn)算符,比較op1和op2對(duì)應(yīng)位,對(duì)于每個(gè)二進(jìn)制位來(lái)說(shuō),如果二者該位有一個(gè)是1或者都是1,則結(jié)果為1;否則,結(jié)果為0。運(yùn)算符運(yùn)算符類(lèi)型邏輯運(yùn)算符賦值運(yùn)算符運(yùn)算符說(shuō)明&與運(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)先級(jí)級(jí)別運(yùn)算符說(shuō)明級(jí)別運(yùn)算符說(shuō)明13-,+正,負(fù)12!,邏輯非,按位取反或補(bǔ)碼11*,/,%乘,除,取模10+,-加,減9按位左移,按位右移8=,7=,!=等于,不等于6&按位與5按位異或4|按位或3&邏輯與2|邏輯或1=,+=,-=,*=,/=,%=,=,=,&=賦值、運(yùn)算且賦值較高運(yùn)算級(jí)別的運(yùn)算符優(yōu)先于低級(jí)別的運(yùn)算符進(jìn)行求值運(yùn)算。小結(jié)本地變量環(huán)境變量變量替換位置變量標(biāo)準(zhǔn)變量特殊變量影響變量的命令引號(hào)運(yùn)算符表達(dá)式替換運(yùn)算符優(yōu)先級(jí)Shell 輸入、輸出控制e
23、choreadcat管道tee文件重定向echoecho顯示文本或變量,或者把字符串輸入到文件命令格式echo string-e 表示解析轉(zhuǎn)義字符 -n 回車(chē)不換行,linux默認(rèn)回車(chē)換行控制字符: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從鍵盤(pán)或文件的某一行文本中讀入信息,并將其賦給一個(gè)變量命令格式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)輸出、輸入及錯(cuò)誤
25、文件文件描述符輸入文件標(biāo)準(zhǔn)輸入0(缺省是鍵盤(pán),也可以是文件或其他命令的輸出)輸出文件標(biāo)準(zhǔn)輸出1(缺省是屏幕,也可以是文件)錯(cuò)誤輸出文件標(biāo)準(zhǔn)錯(cuò)誤2(缺省是屏幕,也可以是文件) 在shell 中執(zhí)行命令時(shí),每個(gè)進(jìn)程都和三個(gè)打開(kāi)的文件相關(guān)聯(lián),并使用文件描述符來(lái)引用這些文件。由于文件描述符不容易記憶,shell同時(shí)也給出了相應(yīng)的文件名。文件重定向改變程序運(yùn)行的輸入來(lái)源和輸出地點(diǎn)1. command filename把標(biāo)準(zhǔn)輸出重定向到一個(gè)新文件中2. command filename把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中(追加)3. command 1 filename把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中4. comma
26、nd filename2 &1 把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤一起重定向到一個(gè)文件中5. command2 filename把標(biāo)準(zhǔn)錯(cuò)誤重定向到一個(gè)文件中6. command2 filename把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中(追加)文件重定向改變程序運(yùn)行的輸入來(lái)源和輸出地點(diǎn)7. Command filename 2 &1把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤一起重定向到一個(gè)文件中(追加)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)建一個(gè)文件重定向標(biāo)準(zhǔn)輸入示例sort file將file文件中的數(shù)據(jù)作為輸入,sort對(duì)其進(jìn)行排序,然后將排序后的結(jié)果輸出到屏幕上sort name.out第8種情況對(duì)排序后的內(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)錯(cuò)誤示例:rootjack shell# grep “trd” book.txtGrep: missiles:No such file or directoryrootjack shell# grep “trd” book.txt 2 /dev/null解釋?zhuān)罕硎景彦e(cuò)誤信息扔給/dev/null , /dev/null 不會(huì)保存錯(cuò)誤信息,實(shí)質(zhì)就是
29、丟失錯(cuò)誤信息。如果sky.txt不存在,則錯(cuò)誤信息存入到一個(gè)指定的文件中,如:ls -al sky.txt 2 err_message.txt文件重定向舉例結(jié)合使用標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤示例: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個(gè)文件的內(nèi)容重定向到accounts.out中,如果某一個(gè)文件不存在,或出錯(cuò),則將錯(cuò)誤信息重定向到錯(cuò)誤文件中acc
30、ounts.err文件重定向舉例合并標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤示例:合并的時(shí)候shell是從左到右分析相應(yīng)命令grep “standard” standard.txt grep.out 2&1-如果文件不存在,則把錯(cuò)誤信息記錄到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管道重點(diǎn)掌握tee文件重定向重點(diǎn)掌握條件測(cè)試shell的內(nèi)部命令里面有測(cè)試條件的語(yǔ)法test給if
31、while用 test condition或者 condition 條件測(cè)試文件狀態(tài)測(cè)試邏輯操作符字符串測(cè)試數(shù)值測(cè)試expr文件狀態(tài)測(cè)試格式: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 文件可寫(xiě) -x file 文件可執(zhí)行 -k file 設(shè)定了限定位 -g file 設(shè)定了組位 -u file 設(shè)定了user
32、 id -p file 管線(xiàn)字符串測(cè)試命令格式 操作符 字符串 字符串 操作符 字符串 舉例 -z $EDITOR $EDITOR = “vi” 操作符含義=相等!=不等-z空串-n非空串?dāng)?shù)值測(cè)試命令格式”數(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ù)增量計(jì)數(shù)LOOP=0LOOP=expr $LOOP + 1數(shù)值測(cè)試模式匹配條件測(cè)試小結(jié)文件狀態(tài)測(cè)試邏輯操作符字符串測(cè)試數(shù)值測(cè)試expr控制流結(jié)構(gòu)流控制if then else:條件測(cè)試case:匹配模式、單詞或值循環(huán)for 循環(huán)until循環(huán)while循環(huán)if then else語(yǔ)句語(yǔ)法格式:if 條件1then 命令1elif 條件2then 命令2else 命令3fi示例:if 10 -lt 11 then echo 10 is less than 11fiif then else語(yǔ)句#
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語(yǔ)句#!/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語(yǔ)句語(yǔ)法格式:case 值 in 模式1)命令1;模式2)命令2;esac模式匹配:* 表示任意字符? 表示任意單個(gè)字符 abc a、b 或 c 三字符其
36、中之一 a-n 從a到n的任一字符 | 多重選擇 case語(yǔ)句#!/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)語(yǔ)法格式: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列表?yè)Q為: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示例:將大寫(xiě)文件名改為小寫(xiě)文件名。for f in *; do mv $f echo $f | tr A-Z a-zdoneuntil循環(huán)語(yǔ)法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” #得到磁盤(pán)使用的百分比LOOK_OUT=df |grep $part | awk print $5 | sed s/%/g echo $ LOOK_OUTuntil $ LOOK_OUT -gt “90 doecho “文件備份已經(jīng)快滿(mǎn)了!” | mail root LOOK_OUT=df |grep $part | aw
40、k print $5 | sed s/%/g sleep 3600donenohup ./文件名.sh后臺(tái)運(yùn)行程序休息3600秒while 循環(huán)語(yǔ)法格式: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ì)跳出循環(huán),跳過(guò)本次
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 “錯(cuò)誤的輸入”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 “錯(cuò)誤的輸入,是否繼續(xù)(y/n)?”read
45、 IS_CONTINUEcase $IS_CONTINUE iny|yes|Y|YES)continue;*)break;esacesacdoneSHELL實(shí)例 設(shè)計(jì)一個(gè)Shell程序,在/userdata目錄下建立50個(gè)目錄,即user1user50,并設(shè)置每個(gè)目錄的權(quán)限,其中其他用戶(hù)的權(quán)限為:讀;文件所有者的權(quán)限為:讀、寫(xiě)、執(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í)編寫(xiě)一個(gè)菜單界面1:顯示當(dāng)前目錄下所有文件2:顯示當(dāng)前目錄下所有文件大小3:使用vi編輯器4:查看當(dāng)前系統(tǒng)中登陸的用戶(hù)q:退出菜單控制流結(jié)構(gòu)小結(jié)流控制if then else:條件測(cè)試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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025國(guó)有資產(chǎn)轉(zhuǎn)讓合同范本
- 北京市家庭裝修合同
- 撰寫(xiě)勞務(wù)合同范例
- 兼職監(jiān)控安裝合同范例
- 建房電工合同范例
- 代理手機(jī)合同范例
- 合作門(mén)店押金合同范例
- 企業(yè)財(cái)產(chǎn)贈(zèng)與合同范例
- 農(nóng)村建房包工協(xié)議合同范例
- 收購(gòu)app合同范例
- 高校人力資源管理系統(tǒng)
- 03船舶證書(shū)一覽表
- 國(guó)外發(fā)達(dá)國(guó)家中水回用現(xiàn)狀
- 墻體構(gòu)造設(shè)計(jì)
- 成人哮喘生命質(zhì)量評(píng)分表
- 相親相愛(ài)一家人簡(jiǎn)譜
- 數(shù)字油畫(huà)-社團(tuán)活動(dòng)記錄課件
- 燃?xì)饧t外線(xiàn)輻射采暖技術(shù)交底
- 液壓系統(tǒng)課件(完整)課件
- 驗(yàn)收合格證明(共9頁(yè))
- 蘇強(qiáng)格命名規(guī)則
評(píng)論
0/150
提交評(píng)論