UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇)_第1頁(yè)
UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇)_第2頁(yè)
UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇)_第3頁(yè)
UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇)_第4頁(yè)
UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇)_第5頁(yè)
已閱讀5頁(yè),還剩141頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

UnixShell編程

基礎(chǔ)篇北京神州數(shù)碼思特奇信息技術(shù)股份有限公司研究院課程目標(biāo)熟練編寫UnixShell程序內(nèi)容提綱Shell介紹Shell腳本介紹Shell特性正則表達(dá)式變量與運(yùn)算符Shell的輸入與輸出Shell函數(shù)腳本調(diào)試高級(jí)編程技巧Shell工具SHELL介紹Shell-UNIX命令解釋器問(wèn)題引入:DOS系統(tǒng)的命令由command負(fù)責(zé)執(zhí)行,并且對(duì)重覆性或多個(gè)命令運(yùn)行可寫成批處理文件,只要執(zhí)行這個(gè)批處理文件就等於執(zhí)行這些命令。UNIX系統(tǒng)如何處理?Shell:shell是一種命令語(yǔ)言,同時(shí)又是一種程序設(shè)計(jì)語(yǔ)言。

UNIX系統(tǒng)利用shell命令解釋器(command-languageinterpreter),完成用戶輸入命令的執(zhí)行,是用戶與系統(tǒng)交互的界面,是命令與kernel之間的接口。shell接收用戶輸入的命令,對(duì)命令作出解釋,然后發(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腳本介紹為什么使用Shell腳本?批量命令重復(fù)、條件等控制Shell腳本的基本內(nèi)容#!/bin/sh

第一行注釋:#

第二行變量 第三行條件判斷、循環(huán) 第四行腳本的運(yùn)行方式chmod?+x

腳本./腳本文件名Shell腳本介紹示例:hello.sh#!/bin/bash#這是一個(gè)基本的shell腳本op="helloworld"echo$opSHELL特性Shell特性別名命令替換管道重定向后臺(tái)處理模式匹配變量特殊字符別名aliasEg: aliasll=`ls-alh`命令替換myfile的內(nèi)容如下:marmfindfile實(shí)現(xiàn)替換如下:

ls`catmyfile`-al后臺(tái)處理什么是后臺(tái)?一個(gè)終端可以同時(shí)運(yùn)行多個(gè)程序用法:nohupcommand&可以再后臺(tái)運(yùn)行此命令示例:

nohubtar-czf要壓縮的文件名壓縮后的文件名

&查看后臺(tái)命令使用:jobs–l變量示例:

#!/bin/bash #這是一個(gè)基本的shell腳本

printchar=“helloworld” echo$printchar變量用來(lái)存儲(chǔ)信息管道(|)把一個(gè)命令的輸出連接到另一個(gè)命令的輸入。示例:ls|sortcatfunc.txt|grep-v^# 重定向(<>)與管道相關(guān),可以改變程序運(yùn)行的輸入來(lái)源和輸出地點(diǎn)示例:sort<myfile.txt 對(duì)文件中內(nèi)容進(jìn)行排序sort<myfile.txt>myfile_test.txt模式匹配顯示以txt為擴(kuò)展名的文件或顯示以a開(kāi)頭的文件,這種情況稱為模式匹配。實(shí)現(xiàn)方式:正則表達(dá)式 如:ls*.txt特殊字符分號(hào)(;):允許在一行上放多個(gè)命令。eg:cd~/backup

;mkdirstartup

;cp~/.*startup/.&:命令后執(zhí)行。括號(hào)():創(chuàng)建成組的命令。豎桿(|):管道標(biāo)示符。<>&:表示重定向。*?[]!:表示模式匹配。$:變量名的開(kāi)頭。#:表示注釋(第一行除外)??崭?,制表符,換行符:當(dāng)做空白。$((...)):對(duì)括號(hào)內(nèi)的表達(dá)式求值eg:#!/bin/shx=0while["$x"-ne10];doecho$x

x=$(($x+1))

doneexit0特殊字符**:兩個(gè)星號(hào)在運(yùn)算時(shí)代表"次方"的意思

eg:"sus=2**3"echo"sus=$sus"$sus=8{}大括號(hào):用法一:通配符擴(kuò)展

eg:lsmy_{finger,toe}s

這條命令相當(dāng)于如下命令的組合:

lsmy_fingersmy_toeseg:mkdir{userA,userB,userC}-{home,bin,data}用法二:可用于語(yǔ)句塊的構(gòu)造。'string'單引號(hào)和"string"雙引號(hào)雙引號(hào):如果想在定義的變量中加入空格,就必須使用單引號(hào)或雙引號(hào),單、雙引號(hào)的區(qū)別在于雙引號(hào)轉(zhuǎn)義特殊字符而單引號(hào)不轉(zhuǎn)義特殊字符

eg:$heyyou=home$echo'$heyyou'$$heyyou ($沒(méi)有轉(zhuǎn)義)

eg:$heyyou=home$echo"$heyyou"$home ($轉(zhuǎn)義了輸出了heyyou變量的值)特殊字符單引號(hào):由單引號(hào)括起來(lái)的字符都作為普通字符出現(xiàn)。特殊字符用單引號(hào)括起來(lái)以后,也會(huì)失去原有意義,而只作為普通字符解釋。例如:?jiǎn)我?hào):由雙引號(hào)括起來(lái)的字符,除$,\,'和"這幾個(gè)字符仍是特殊字符并保留其特殊功能外,其余字符仍作為普通字符對(duì)待。[root@localhost/]#String="$PATH\\\"\$PATH"[root@localhost/]#echo$String/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:\"$PATH特殊字符雙引號(hào)(“):用來(lái)使shell無(wú)法認(rèn)出空格、制表符和其他大多數(shù)特殊字符,這樣“DavidMedinets”表示一個(gè)值。讓$反斜杠反引號(hào)不失效單引號(hào)(‘):用來(lái)使shell無(wú)法認(rèn)出所有特殊字符。反引號(hào)(`):用來(lái)替換命令。反斜杠(\):用來(lái)使shell無(wú)法認(rèn)出以上的特殊字符,使其后的特殊字符失去特殊含義。如:David\Medinets[root@sky/root]#touchDavid\Medinets[root@sky/root]#lsDavid\medinets放在指令前,有取消aliases(別名)的作用;放在特殊符號(hào)前,則該特殊符號(hào)的作用消失;放在指令的最末端,表示指令連接下一行(使得回車符無(wú)效,只起換行作用)正則表達(dá)式模式匹配:正則表達(dá)式正則表達(dá)式在shell、工具程序、Perl語(yǔ)言中有非常重要的地位。正則表達(dá)式通過(guò)一些特殊符號(hào)表示特定的字符串模式。常見(jiàn)的特殊字符包括:字符

功能^置于待搜索的字符串之前,匹配行首的字$置于待搜索的字符串之后,匹配行末的字\<匹配一個(gè)字的字頭\>匹配一個(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ù)匹配前一項(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)頭的行morea.txt|grep“^a”查找文本文件中,以a結(jié)尾的行morea.txt|grep“a$”查找文本文件中,所有的空行morea.txt|grep“^$”模式匹配:正則表達(dá)式匹配單個(gè)字符模式:舉例..abc..可以匹配12abc34,ababc43等模式匹配:正則表達(dá)式匹配0或多個(gè)字符模式:*舉例abc12*可以匹配如下abc123abc14248876abc11abc……模式匹配:正則表達(dá)式匹配單詞模式:\<\>功能:匹配完整的單詞舉例\<[dD]ay\>模式匹配:正則表達(dá)式屏蔽特殊字符功能:將字符串中的特殊字符去掉特殊意義特殊字符$.‘“*[]^|()\+?舉例匹配包含.字符的行:\.匹配包含$的行:\$匹配包含\的行:\\模式匹配:正則表達(dá)式匹配范圍功能:匹配特定的字符串或字符串集舉例[0123456789]或[0-9]: 匹配任意數(shù)字[A-Za-z]: 匹配任意字母a[a-zA-Z]t: a開(kāi)始+任意字母+t[hH]ello: 匹配Hello或者h(yuǎn)ello[^0-9]: 匹配任一個(gè)非數(shù)字字符[^a-zA-Z]: 匹配任一個(gè)非字母字符模式匹配:正則表達(dá)式匹配模式結(jié)果出現(xiàn)次數(shù)pattern\{n\}匹配模式出現(xiàn)n次。pattern\{n,\}匹配模式出現(xiàn)最少n次。pattern\{n,m\}匹配模式出現(xiàn)n到m次之間,n,m為0-255中任意整數(shù)。模式匹配:正則表達(dá)式舉例A\{2\}BAABA\{4,\}BAAAAB,AAAAAB,AAAAAAB……A\{2,4\}BAAB,AAAB,AAAAB模式匹配:正則表達(dá)式練習(xí)從如下文本中,選出日期格式符合yyyy.mm.dd的行2006-05-1713910591921chenyq2006071113301131125suwn2006.07.1913123451231aaa2005/11/2513611258734bbb過(guò)濾模式:[0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}模式匹配:正則表達(dá)式變量與表達(dá)式變量與運(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)變量特殊變量影響變量的命令本地變量本地變量在用戶現(xiàn)在的shell生命期的腳本中存在使用。variable-name=value 設(shè)置變量及值set顯示本地所有的變量readonlyvariable-name 變量只讀設(shè)置后不能在設(shè)置回來(lái)了。本地變量(續(xù))[root@jack/root]#LOCALTEST=“test”[root@jack/root]#echo${LOCALTEST}Test[root@jack/root]#readonlyLOCALTEST[root@jack/root]#LOCALTEST=“test1”Bash:LOCALTEST:readonlyvariable[root@jack/root]#readonly [-p] 查看當(dāng)前設(shè)置的本地變量Declare–rLOCALTEST=“test”Declare–irUID=“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: exportSITECH=“BeiJing” readonlySITECH 設(shè)置只讀環(huán)境變量如果使用了readonly命令的話,變量就不可以被修改或清除了。示例如下:

$exportTEST=“Test...” #增加一個(gè)環(huán)境變量TEST

$readonlyTEST #將環(huán)境變量TEST設(shè)為只讀

$unsetTEST #會(huì)發(fā)現(xiàn)此變量不能被刪除

-bash:unset:TEST:cannotunset:readonlyvariable

$TEST="New" #會(huì)發(fā)現(xiàn)此也變量不能被修改

-bash:TEST:readonlyvariable

set、env、export區(qū)別set 顯示當(dāng)前shell的變量,包括當(dāng)前用戶的變量env 顯示當(dāng)前用戶的變量export 顯示當(dāng)前導(dǎo)出成用戶變量的shell變量每個(gè)shell有自己特有的變量(set)顯示的變量,這個(gè)和用戶變量是不同的,當(dāng)前用戶變量和你用什么shell無(wú)關(guān),不管你用什么shell都在,比如HOME,SHELL等這些變量,但shell自己的變量不同,shell是不同的,比如BASH_ARGC,BASH等,這些變量只有set才會(huì)顯示,是bash特有的,export不加參數(shù)的時(shí)候,顯示哪些變量被導(dǎo)出成了用戶變量,因?yàn)橐粋€(gè)shell自己的變量可以通過(guò)export“導(dǎo)出”變成一個(gè)用戶變量。

[root@linux~]#aaa=bbb

[root@linux~]#echo$aaa

bbb

[root@linux~]#set|grepaaa

aaa=bbb[root@linux~]#env|grepaaa

[root@linux~]#exportaaa

[root@linux~]#env|grepaaa

aaa=bbb環(huán)境變量用C程序來(lái)訪問(wèn)和設(shè)置環(huán)境變量

使用下列三個(gè)函數(shù)來(lái)設(shè)置或訪問(wèn)一個(gè)環(huán)境變量。

◆getenv()訪問(wèn)一個(gè)環(huán)境變量。輸入?yún)?shù)是需要訪問(wèn)的變量名字,返回值是一個(gè)字符串。如果所訪問(wèn)的環(huán)境變量不存在,則會(huì)返回NULL。

◆setenv()在程序里面設(shè)置某個(gè)環(huán)境變量的函數(shù)。

◆unsetenv()清除某個(gè)特定的環(huán)境變量的函數(shù)。

有一個(gè)指針變量environ,它指向的是包含所有的環(huán)境變量的一個(gè)列表。下面的程序可以打印出當(dāng)前運(yùn)行環(huán)境里面的所有環(huán)境變量:

#include<stdio.h>

externchar**environ;

intmain()

{

char**var;

for(var=environ;*var!=NULL;++var)

printf("%s\n",*var);

return0;

}

還可以通過(guò)修改一些相關(guān)的環(huán)境定義文件來(lái)修改環(huán)境變量,比如對(duì)于RedHat等Linux發(fā)行版本,與環(huán)境相關(guān)的文件有/etc/profile和~/.bashrc等。修改完畢后重新登錄一次就生效了。

變量替換(續(xù))1.echo${variablename} 顯示實(shí)際值到variablename中2.echo${variablename:+value}如果設(shè)置了variablename,則顯示其值value,否則顯示為空。3.echo${variablename:?value}如果未設(shè)置variablename,則顯示用戶自定義的錯(cuò)誤信息value。4.echo${variablename:-value}如果未設(shè)置variablename,則顯示其值value。否則顯示原來(lái)值。5.echo${variablename:=value}如果未設(shè)置variablename,設(shè)置其值為value,并顯示。變量替換(續(xù))unset:

刪除環(huán)境變量unsetvariable-name例如:[root@jack/root]#testvar=“thisisatest”[root@jack/root]#echo${testvar}Thisisatest[root@jack/root]#unsettestvar[root@jack/root]#echo${testvar}[root@jack/root]#如果是readonly的變量是不能進(jìn)行取消刪除的。位置變量位置變量表示形式:$0,$1,$2……$9向腳本中使用位置參數(shù)向系統(tǒng)命令傳遞參數(shù)$1、$2、$3……${10}、${11}、${12}……

:表示腳本傳入的的各個(gè)參數(shù),注意當(dāng)需表示兩位數(shù)以后的參數(shù)時(shí)數(shù)字要用花括號(hào)括起。$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中定義。EXINITHOME echo${HOME}IFSLOGNAME echo$LOGNAME 獲取當(dāng)前登錄名set|grep‘LOG‘ 與之功能等價(jià)MAILset|grep‘MAIL‘ MAIL=/usr/spool/mail/account 存放郵箱位置MAILCHECK=600 每隔600秒掃描郵箱一次MAILMSG=‘[YOUHAVENEWMAIL]‘ 郵箱信息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’表示時(shí)區(qū)EDITORPWD eg:set|grep‘PWD’ 取得當(dāng)前目錄信息MANPATH eg:set|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用于取消變量的定義--表明選項(xiàng)結(jié)束-f刪除只讀變量,但不能取消從shell環(huán)境中刪除指定的變量和函數(shù)。 如: PATH,PS1,PS2,PPID,UID,EUID等的設(shè)置。運(yùn)算符運(yùn)算符類型位運(yùn)算符~,<<,>>,&,|,^$[]表示對(duì)方括號(hào)中的表達(dá)式進(jìn)行求值$[2^4] 例如:#!/bin/bash#$[]

表示舉例echo$[2+8]運(yùn)算符位運(yùn)算符運(yùn)算符說(shuō)明~op1反運(yùn)算符,把op1中所有的二進(jìn)制位的1變?yōu)?,0變?yōu)?。op1<<op2左移運(yùn)算符,把op1中的二進(jìn)制位向左移動(dòng)op2位,忽略最左端移出的各位,最右端的各位補(bǔ)上0值,每做一次按位左移就有實(shí)現(xiàn)op1乘以2op1>>op2右移運(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)制位來(lái)說(shuō),如果二者該位都是1,則結(jié)果為1;否則,結(jié)果為0。op1^op2異或比較運(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)算符類型邏輯運(yùn)算符賦值運(yùn)算符運(yùn)算符說(shuō)明&&與運(yùn)算符||或運(yùn)算符>,<,==,!=+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=eg: var=65 letvar+=4 echo$var //69表達(dá)式替換$[]和$((**))習(xí)慣使用$[],所有shell的求值都是用整數(shù)完成。$[]可以接受不同基數(shù)的數(shù)字[base#n]n表示基數(shù)從2到36的任何基數(shù)。eg:八進(jìn)制的10加1,結(jié)果為9echo$[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輸入、輸出echoreadcat管道tee文件重定向Shell輸入、輸出控制echo顯示文本或變量,或者把字符串輸入到文件命令格式echostring-e表示解析轉(zhuǎn)義字符-n回車不換行,linux默認(rèn)回車換行控制字符:\c-不換行;\t-跳格;\n-換行舉例echo“What’syour\nname:\c”readnameecho$LOGNAMEecho示例:echo舉例#!/bin/bash#echodecho–e“Thisecho’s3newlines\n\n\n\n”echo“OK”echoecho“Thisecho’s3newlines\n\n\n\n”echo“Thelogfileshaveallbeendone”>mylogfile.txtread從鍵盤或文件的某一行文本中讀入信息,并將其賦給一個(gè)變量命令格式read變量1變量2…舉例$readname1name2tomjerrybobread示例:#!/bin/bash#readnameecho–n“FirstName”readfirstnameecho–n“LastName:”readlastnameecho–e“YourFirstNameis:${firstname}\n”echo–e“YourLastNameis:${lastname}\n”read舉例文件重定向標(biāo)準(zhǔn)輸出、輸入及錯(cuò)誤在shell中執(zhí)行命令時(shí),每個(gè)進(jìn)程都和三個(gè)打開(kāi)的文件相關(guān)聯(lián),并使用文件描述符來(lái)引用這些文件。由于文件描述符不容易記憶,shell同時(shí)也給出了相應(yīng)的文件名。文件文件描述符輸入文件——標(biāo)準(zhǔn)輸入0(缺省是鍵盤,也可以是文件或其他命令的輸出)輸出文件——標(biāo)準(zhǔn)輸出1(缺省是屏幕,也可以是文件)錯(cuò)誤輸出文件——標(biāo)準(zhǔn)錯(cuò)誤2(缺省是屏幕,也可以是文件)文件重定向改變程序運(yùn)行的輸入來(lái)源和輸出地點(diǎn)1.command>filename把標(biāo)準(zhǔn)輸出重定向到一個(gè)新文件中2.command>>filename把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中(追加)3.command1>filename把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中4.command>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>>filename2>&1把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤一起重定向到一個(gè)文件中(追加)8.Command<filename>filename2command命令以filename文件作為標(biāo)準(zhǔn)輸入,以filename2文件作為標(biāo)準(zhǔn)輸出9.Command<<delimiter從標(biāo)準(zhǔn)輸入中讀入,直至遇到delimiter分界符10.Command<&m把文件描述符m作為標(biāo)準(zhǔn)輸入11.Command>&m把標(biāo)準(zhǔn)輸出重定向到文件描述符m中12.Command2<&-關(guān)閉標(biāo)準(zhǔn)輸入例1:將myfle1作為sort的輸入。

$sort<myflle1

例2:將date的輸出轉(zhuǎn)向到myfile2文件中。

$date>myfile2

例3:將Is-l的輸出追加到myfile3文件中。

$Is-l>>myfile3

例4:將myprogram錯(cuò)誤輸出改向到err_file文件。$myprogram2>err_file文件重定向舉例重定向標(biāo)準(zhǔn)輸出示例catfile|sort1>sort.out 第3種情況catfile|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.txt>name.out 第8種情況對(duì)排序后的內(nèi)容輸出到name.out文件中文件重定向舉例標(biāo)準(zhǔn)輸入示例:

第9種情況[root@jackshell]#cat>>term.txt<<SITECH>Hello,thereIamusinga$TERM!>andmyusernameis$LOGNAME>bye…>SITECH[root@jackshell]#catterm.txtHello,thereIamusingavt100!andmyusernameisrootbye…文件重定向舉例重定向標(biāo)準(zhǔn)錯(cuò)誤示例:

[root@jackshell]#grep“trd”book.txtGrep:missiles:Nosuchfileordirectory[root@jackshell]#grep“trd”book.txt2>/dev/null解釋:表示把錯(cuò)誤信息扔給/dev/null,/dev/null不會(huì)保存錯(cuò)誤信息,實(shí)質(zhì)就是丟失錯(cuò)誤信息。如果sky.txt不存在,則錯(cuò)誤信息存入到一個(gè)指定的文件中,如: ls-alsky.txt2>err_message.txt文件重定向舉例結(jié)合使用標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤示例:

[root@jackshell]#cataccount_new.txt\Account_old.txt1>accounts.out2>accounts.err[root@jackshell]#cataccounts.out???[root@jackshell]#cataccounts.err???文件重定向舉例將2個(gè)文件的內(nèi)容重定向到accounts.out中,如果某一個(gè)文件不存在,或出錯(cuò),則將錯(cuò)誤信息重定向到錯(cuò)誤文件中accounts.err合并標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤示例:

合并的時(shí)候shell是從左到右分析相應(yīng)命令 grep“standard”standard.txt>grep.out2>&1->如果文件不存在,則把錯(cuò)誤信息記錄到grep.out中->如果文件存在,也把正確的信息記錄到grep.out中文件重定向舉例重定向標(biāo)準(zhǔn)輸出ls–l>ls.outls–l>>ls.out重定向標(biāo)準(zhǔn)輸入sort<name.txt重定向標(biāo)準(zhǔn)錯(cuò)誤a.sh2>/dev/null組合重定向find.–name“*.log”>find.log2>&1練習(xí)echoreadcat管道 重點(diǎn)掌握tee文件重定向 重點(diǎn)掌握小結(jié)SHELL控制結(jié)構(gòu)條件測(cè)試shell的內(nèi)部命令里面有測(cè)試條件的語(yǔ)法test給ifwhile用testcondition

或者

[condition]條件測(cè)試文件狀態(tài)測(cè)試邏輯操作符字符串測(cè)試數(shù)值測(cè)試expr文件狀態(tài)測(cè)試格式:test狀態(tài)或[狀態(tài)]舉例test–wstudent.txtecho$?[-xstudent.txt]echo$?[-efile]文件存在

[-d/etc/]目錄存在

[-sfile]文件大小大于0

[-rfile]文件可讀

[-bfile]區(qū)塊文件

[-cfile]字符文件

[-ffile]一般文件

[-wfile]文件可寫

[-xfile]文件可執(zhí)行

[-kfile]設(shè)定了限定位

[-gfile]設(shè)定了組位

[-ufile]設(shè)定了userid

[-pfile]管線[-ofile]如果當(dāng)前用戶擁有filename,則為真字符串測(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–ge110]echo$?["900"-le"901"-a"100"-gt"99"]echo$?操作符含義-eq等于-ne不等于-gt大于-lt小于-le小于等于-ge大于等于邏輯操作符邏輯操作符-a

邏輯與-o

邏輯或!邏輯否舉例[-xstudent-a-wstudent]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)流控制ifthenelse:條件測(cè)試case:匹配模式、單詞或值循環(huán)for循環(huán)until循環(huán)while循環(huán)ifthenelse語(yǔ)句語(yǔ)法格式:if條件1 then 命令1elif條件2 then 命令2else命令3fi示例:if["10"-lt"11"]thenecho"10islessthan11"fiifthenelse語(yǔ)句#!/bin/sh#ifsamples2echo-n"Enteryourname:"readNAMEif["$NAME"=""]||[-z$NAME]then echo"sorry,youdidnotenteraname"else echo"youentered$NAME"fi示例:#!/bin/sh#ifcpifcpmyfile.bakmyfile;then echo“goodcopy"else echo“‘basename$0’:errorcouldnotcopythefiles”>&2fiifthenelse語(yǔ)句#!/bin/sh#ifelifecho-n"Enteryourname:"readNAMEif["$NAME"=""]||[-z$NAME];then echo“Youdidnotenteraname.“elif["$NAME"=“root"]; echo“Helloroot.“elif["$NAME"=“jack"]; echo“Hellojack.“else echo"youarenotorjack,buthi,$NAME”fi示例:case語(yǔ)句語(yǔ)法格式:case值in

模式1)

命令1 … ;;

模式2)

命令2 … ;;esac模式匹配: *表示任意字符 ?表示任意單個(gè)字符 [abc]

a、b或c三字符其中之一

[a-n]

從a到n的任一字符

|

多重選擇case語(yǔ)句#!/bin/sh#casetest1echo-n"enteranumberbetween1and3pls.:"readNUMcaseNUMin1)echo"youentered1";;2)echo"youentered2";;3)echo"youentered3";;Y|y)echo“youentered$NUM”;;*)echo"`basename$0`"exit1;;esac示例:for循環(huán)語(yǔ)法格式:for變量名in列表do

命令1

命令2 ……donefor循環(huán)#!/bin/sh#fortest1forloopin12345do echo$loopdone示例:#!/bin/sh#fortest2forloopin“isthisyourpen?”do echo$loopdone列表?yè)Q為:isthisyourpen?或`catmyfile`for循環(huán)#!/bin/sh#fortest3BAK=".bak"forloopin`ls`do echo"backup$loopto$loop$BAK" cp$loop$loop$BAKdone示例:for循環(huán)#!/bin/sh#fortest4counter=0forfilesin*do counter=`expr$counter+1`doneecho"Thereare$counterfilesin`pwd`"示例:for循環(huán)將.foo后綴的文件批量改名為.bar后綴。

forfin*.foo;do

base=`basename$f.foo`

mv$f$base.bardone示例:將大寫文件名改為小寫文件名。

forfin*;do

mv$f`echo$f|tr'[A-Z]''[a-z]'`

doneuntil循環(huán)語(yǔ)法until條件命令1命令2…done示例: #!/bin/sh #untiltest2 counter=0 echo$counter until["$counter"-ge"100"] do counter=`expr$counter+1` echo$counter done條件發(fā)生在循環(huán)末尾,至少執(zhí)行一次循環(huán)until循環(huán)示例: #!/bin/sh #until_mon part=“/backup”#得到磁盤使用的百分比

LOOK_OUT=`df|grep$part|awk‘{print$5}’|sed‘s/%//g’` echo$LOOK_OUT until["$LOOK_OUT"-gt“90"] do echo“文件備份已經(jīng)快滿了!”|mailroot LOOK_OUT=`df|grep$part|awk‘{print$5}’|sed‘s/%//g’` sleep3600 donenohup./文件名.sh 后臺(tái)運(yùn)行程序休息3600秒while循環(huán)語(yǔ)法格式:while條件do

命令1

命令2 ……donewhile循環(huán)#!/bin/sh#whiletest1counter=0echo$counterwhile["$counter"-lt"100"]do counter=`expr$counter+1` echo$counterdone示例1:while循環(huán)#!/bin/sh#whiletest2whilereadLINEdoecho$LINEdone<a.sh示例2:表示從a.sh文件中一行行讀出數(shù)據(jù)到LINE中,循環(huán)輸出while循環(huán)yymm=200810no=10low=0con_db=dbaccopr/accoprdb152@ACCDBtab_name=all_owedet_tmpsrc=dcustowesqlplus-s${con_db}<<!droptable${tab_name};createtable${tab_name}(……);while[${no}-lt100]doif[$no-lt10]thensqlplus-s${con_db}<<!insertinto${tab_name}select字段,….from${src}${yymm}${low}${no};commit;elif[$no-lt100]theninsertinto${tab_name}selectcontract_no,id_no,fee_code,detail_code,cust_id,payed_status,should_payshould,favour_feefavour,payed_prepayfrom${src}${yymm}${no};

fino=`expr${no}+1`doneexit!示例3while循環(huán)yymm=200810num=10low=0con_db=dbaccopr/accoprdb152@ACCDBtab_name=all_owedet_tmpsrc=dcustowesqlplus-s${con_db}<<!while[${num}-lt100]doecho${num};insertinto${tab_name}

selectcontract_no,id_no,fee_code,detail_code,cust_id,payed_status,should_payshould,favour_feefavour,payed_prepayfrom${src}${yymm}${num};commit; num=`expr${num}+1`}doneexit!示例4:循環(huán)控制break跳出循環(huán)continue不會(huì)跳出循環(huán),跳過(guò)本次循環(huán),進(jìn)入下一次循環(huán)循環(huán)控制舉例示例:#!/bin/sh#breakoutwhile:doecho–n“Enteranynumber[1…5]:” readANS case$ANSin 1|2|3|4|5) echo“您鍵入正確的數(shù)字.” ;; *) echo“錯(cuò)誤的輸入”

break ;; esacdone:表示永遠(yuǎn)為真循環(huán)控制舉例示例:#!/bin/sh#breakoutwhile:doecho–n“Enteranynumber[1…5]:” readANS case$ANSin 1|2|3|4|5) echo“您鍵入正確的數(shù)字.” ;; *) echo“錯(cuò)誤的輸入,是否繼續(xù)(y/n)?”

readIS_CONTINUE case$IS_CONTINUEin y|yes|Y|YES) continue ;;

*)

break ;;

esac esacdoneSHELL實(shí)例設(shè)計(jì)一個(gè)Shell程序,在/userdata目錄下建立50個(gè)目錄,即user1~user50,并設(shè)置每個(gè)目錄的權(quán)限,其中其他用戶的權(quán)限為:讀;文件所有者的權(quán)限為:讀、寫、執(zhí)行;文件所有者所在組的權(quán)限為:讀、執(zhí)行。考答案:建立程序如下:

#!/bin/sh

i=1

while[i-le50]

do

if[-d/userdata];then

mkdir-p/userdata/user$i

chmod754/userdata/user$i

echo"user$i"

let"i=i+1"(或i=$(($i+1))

else

mkdir/userdata

mkdir-p/userdata/user$i

chmod754/userdata/user$i

echo"user$i"

let"i=i+1"(或i=$(($i+1))

fi

done練習(xí)編寫一個(gè)菜單界面1:顯示當(dāng)前目錄下所有文件2:顯示當(dāng)前目錄下所有文件大小3:使用vi編輯器4:查看當(dāng)前系統(tǒng)中登陸的用戶q:退出菜單控制流結(jié)構(gòu)-小結(jié)流控制ifthenelse:條件測(cè)試case:匹配模式、單詞或值循環(huán)for循環(huán)until循環(huán)while循環(huán)循環(huán)控制breakcontinueSHELL函數(shù)shell函數(shù)函數(shù)定義參數(shù)傳遞函數(shù)文件檢查載入和刪除函數(shù)函數(shù)的返回函數(shù)定義情況一:函數(shù)名(){

命令1

命令2

……}情況二:function

函數(shù)名(){

命令1

命令2

……}函數(shù)定義#!/bin/sh#funcfunctionhello(){echo“你好,今天是:`date`”}echo“======================“helloecho“======================“示例1:函數(shù)定義#!/bin/shdisksum(){echo`ls-l|awk'/^[^d]/{total+=$5}END{print"Totalsizeis:"total}'`}disksum示例2:函數(shù)定義#!/bin/shdisksum(){echo`ls-l|awk'/^[^d]/{total+=$5}END{print"Totalsizeis:"total}'`}disksum示例:參數(shù)傳遞#!/bin/sh#funcfunctionhelo(){echo“你好,$1今天是:`date`”}echo“======================“hellojackecho“======================“示例:向函數(shù)傳遞參數(shù)就是在腳本中使用位置變量:$1,$2,$3……$9函數(shù)文件將常用函數(shù)整理,放在函數(shù)文件中,并載入shell創(chuàng)建函數(shù)文件#!/bin/sh定位文件.函數(shù)名檢查載入函數(shù)set執(zhí)行shell函數(shù)函數(shù)名刪除shell函數(shù)unset函數(shù)名函數(shù)文件舉例示例:#!/bin/sh#func.hellofunecho“======================“helloecho“======================“#!/bin/sh#hellofunfunctionhelo(){ echo“你好,$1今天是:`date`” return1}檢查載入函數(shù)和刪除函數(shù)查看載入函數(shù)Set刪除函數(shù)unset檢查載入函數(shù)和刪除函數(shù)舉例示例:#!/bin/sh#func.hellofunset

表示顯示載入狀態(tài)unsethello

表示刪除hello函數(shù)調(diào)用echo“======================“helloecho“======================“#!/bin/sh#hellofunfunctionhelo(){ echo“你好,$1今天是:`date`” return1}函數(shù)的返回return返回狀態(tài)值不能當(dāng)成變量的返回對(duì)待!使用return返回腳本中函數(shù)調(diào)用的下一語(yǔ)句return:用最后狀態(tài)命令決定返回值return0:無(wú)錯(cuò)誤返回return1:有錯(cuò)誤返回函數(shù)的返回舉例示例#!/bin/sh#hellofunctionfunctionhelo(){ echo“你好,$1今天是:`date`” return0}#!/bin/sh#func.hellofunctionsetecho“=============================“helloecho$?echo“=============================“$?取得調(diào)用函數(shù)返回的狀態(tài)值shell函數(shù)-小結(jié)函數(shù)定義參數(shù)傳遞函數(shù)文件檢查載入和刪除函數(shù)函數(shù)的返回目的:將文本的ShellScript文件設(shè)為可執(zhí)行的ShellScript

對(duì)任何操作系統(tǒng)而言,文本文件不具備直接執(zhí)行的功能。Dos系統(tǒng)通過(guò)賦予批處理文件(.bat)的類型,使之執(zhí)行。UNIX系統(tǒng)采用將ShellScript文件權(quán)限設(shè)定成可執(zhí)行,或利用shell的內(nèi)建機(jī)制,使ShellScript文件具備執(zhí)行的功能必要條件:將shellscript文件權(quán)限設(shè)為可執(zhí)行

chmodu+xfilename只有用戶自己可執(zhí)行,其它人不能執(zhí)行

chmodug+xfilename僅用戶及同組人可執(zhí)行,其它人不能執(zhí)行

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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)論