![UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇)_第1頁](http://file4.renrendoc.com/view/891da02583145998916e7f6ad21097bb/891da02583145998916e7f6ad21097bb1.gif)
![UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇)_第2頁](http://file4.renrendoc.com/view/891da02583145998916e7f6ad21097bb/891da02583145998916e7f6ad21097bb2.gif)
![UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇)_第3頁](http://file4.renrendoc.com/view/891da02583145998916e7f6ad21097bb/891da02583145998916e7f6ad21097bb3.gif)
![UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇)_第4頁](http://file4.renrendoc.com/view/891da02583145998916e7f6ad21097bb/891da02583145998916e7f6ad21097bb4.gif)
![UnixShell編程基礎(chǔ)培訓(xùn)(基礎(chǔ)篇)_第5頁](http://file4.renrendoc.com/view/891da02583145998916e7f6ad21097bb/891da02583145998916e7f6ad21097bb5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
UnixShell編程
基礎(chǔ)篇北京神州數(shù)碼思特奇信息技術(shù)股份有限公司研究院課程目標(biāo)熟練編寫UnixShell程序內(nèi)容提綱Shell介紹Shell腳本介紹Shell特性正則表達(dá)式變量與運(yùn)算符Shell的輸入與輸出Shell函數(shù)腳本調(diào)試高級編程技巧Shell工具SHELL介紹Shell-UNIX命令解釋器問題引入:DOS系統(tǒng)的命令由command負(fù)責(zé)執(zhí)行,并且對重覆性或多個命令運(yùn)行可寫成批處理文件,只要執(zhí)行這個批處理文件就等於執(zhí)行這些命令。UNIX系統(tǒng)如何處理?Shell:shell是一種命令語言,同時又是一種程序設(shè)計(jì)語言。
UNIX系統(tǒng)利用shell命令解釋器(command-languageinterpreter),完成用戶輸入命令的執(zhí)行,是用戶與系統(tǒng)交互的界面,是命令與kernel之間的接口。shell接收用戶輸入的命令,對命令作出解釋,然后發(fā)送給kernel執(zhí)行之。
shell是一個解釋型的程序設(shè)計(jì)語言。
shell程序(腳本)相當(dāng)于dos的批處理文件,可簡單到只有一條命令,也可以包括循環(huán)、條件語句、數(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#這是一個基本的shell腳本op="helloworld"echo$opSHELL特性Shell特性別名命令替換管道重定向后臺處理模式匹配變量特殊字符別名aliasEg: aliasll=`ls-alh`命令替換myfile的內(nèi)容如下:marmfindfile實(shí)現(xiàn)替換如下:
ls`catmyfile`-al后臺處理什么是后臺?一個終端可以同時運(yùn)行多個程序用法:nohupcommand&可以再后臺運(yùn)行此命令示例:
nohubtar-czf要壓縮的文件名壓縮后的文件名
&查看后臺命令使用:jobs–l變量示例:
#!/bin/bash #這是一個基本的shell腳本
printchar=“helloworld” echo$printchar變量用來存儲信息管道(|)把一個命令的輸出連接到另一個命令的輸入。示例:ls|sortcatfunc.txt|grep-v^# 重定向(<>)與管道相關(guān),可以改變程序運(yùn)行的輸入來源和輸出地點(diǎn)示例:sort<myfile.txt 對文件中內(nèi)容進(jìn)行排序sort<myfile.txt>myfile_test.txt模式匹配顯示以txt為擴(kuò)展名的文件或顯示以a開頭的文件,這種情況稱為模式匹配。實(shí)現(xiàn)方式:正則表達(dá)式 如:ls*.txt特殊字符分號(;):允許在一行上放多個命令。eg:cd~/backup
;mkdirstartup
;cp~/.*startup/.&:命令后執(zhí)行。括號():創(chuàng)建成組的命令。豎桿(|):管道標(biāo)示符。<>&:表示重定向。*?[]!:表示模式匹配。$:變量名的開頭。#:表示注釋(第一行除外)??崭瘢票矸?,換行符:當(dāng)做空白。$((...)):對括號內(nèi)的表達(dá)式求值eg:#!/bin/shx=0while["$x"-ne10];doecho$x
x=$(($x+1))
doneexit0特殊字符**:兩個星號在運(yùn)算時代表"次方"的意思
eg:"sus=2**3"echo"sus=$sus"$sus=8{}大括號:用法一:通配符擴(kuò)展
eg:lsmy_{finger,toe}s
這條命令相當(dāng)于如下命令的組合:
lsmy_fingersmy_toeseg:mkdir{userA,userB,userC}-{home,bin,data}用法二:可用于語句塊的構(gòu)造。'string'單引號和"string"雙引號雙引號:如果想在定義的變量中加入空格,就必須使用單引號或雙引號,單、雙引號的區(qū)別在于雙引號轉(zhuǎn)義特殊字符而單引號不轉(zhuǎn)義特殊字符
eg:$heyyou=home$echo'$heyyou'$$heyyou ($沒有轉(zhuǎn)義)
eg:$heyyou=home$echo"$heyyou"$home ($轉(zhuǎn)義了輸出了heyyou變量的值)特殊字符單引號:由單引號括起來的字符都作為普通字符出現(xiàn)。特殊字符用單引號括起來以后,也會失去原有意義,而只作為普通字符解釋。例如:單引號:由雙引號括起來的字符,除$,\,'和"這幾個字符仍是特殊字符并保留其特殊功能外,其余字符仍作為普通字符對待。[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特殊字符雙引號(“):用來使shell無法認(rèn)出空格、制表符和其他大多數(shù)特殊字符,這樣“DavidMedinets”表示一個值。讓$反斜杠反引號不失效單引號(‘):用來使shell無法認(rèn)出所有特殊字符。反引號(`):用來替換命令。反斜杠(\):用來使shell無法認(rèn)出以上的特殊字符,使其后的特殊字符失去特殊含義。如:David\Medinets[root@sky/root]#touchDavid\Medinets[root@sky/root]#lsDavid\medinets放在指令前,有取消aliases(別名)的作用;放在特殊符號前,則該特殊符號的作用消失;放在指令的最末端,表示指令連接下一行(使得回車符無效,只起換行作用)正則表達(dá)式模式匹配:正則表達(dá)式正則表達(dá)式在shell、工具程序、Perl語言中有非常重要的地位。正則表達(dá)式通過一些特殊符號表示特定的字符串模式。常見的特殊字符包括:字符
功能^置于待搜索的字符串之前,匹配行首的字$置于待搜索的字符串之后,匹配行末的字\<匹配一個字的字頭\>匹配一個字的字尾.匹配任意單個正文字符[str]匹配字符串str中的任意單個字符[^str]匹配不在字符串str中的任意單個字符[a-c]匹配從a到c之間的任一字符*匹配前一個字符的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或多個字符[]匹配[]內(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開頭的行morea.txt|grep“^a”查找文本文件中,以a結(jié)尾的行morea.txt|grep“a$”查找文本文件中,所有的空行morea.txt|grep“^$”模式匹配:正則表達(dá)式匹配單個字符模式:舉例..abc..可以匹配12abc34,ababc43等模式匹配:正則表達(dá)式匹配0或多個字符模式:*舉例abc12*可以匹配如下abc123abc14248876abc11abc……模式匹配:正則表達(dá)式匹配單詞模式:\<\>功能:匹配完整的單詞舉例\<[dD]ay\>模式匹配:正則表達(dá)式屏蔽特殊字符功能:將字符串中的特殊字符去掉特殊意義特殊字符$.‘“*[]^|()\+?舉例匹配包含.字符的行:\.匹配包含$的行:\$匹配包含\的行:\\模式匹配:正則表達(dá)式匹配范圍功能:匹配特定的字符串或字符串集舉例[0123456789]或[0-9]: 匹配任意數(shù)字[A-Za-z]: 匹配任意字母a[a-zA-Z]t: a開始+任意字母+t[hH]ello: 匹配Hello或者h(yuǎn)ello[^0-9]: 匹配任一個非數(shù)字字符[^a-zA-Z]: 匹配任一個非字母字符模式匹配:正則表達(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過濾模式:[0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}模式匹配:正則表達(dá)式變量與表達(dá)式變量與運(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è)置變量及值set顯示本地所有的變量readonlyvariable-name 變量只讀設(shè)置后不能在設(shè)置回來了。本地變量(續(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...” #增加一個環(huán)境變量TEST
$readonlyTEST #將環(huán)境變量TEST設(shè)為只讀
$unsetTEST #會發(fā)現(xiàn)此變量不能被刪除
-bash:unset:TEST:cannotunset:readonlyvariable
$TEST="New" #會發(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變量每個shell有自己特有的變量(set)顯示的變量,這個和用戶變量是不同的,當(dāng)前用戶變量和你用什么shell無關(guān),不管你用什么shell都在,比如HOME,SHELL等這些變量,但shell自己的變量不同,shell是不同的,比如BASH_ARGC,BASH等,這些變量只有set才會顯示,是bash特有的,export不加參數(shù)的時候,顯示哪些變量被導(dǎo)出成了用戶變量,因?yàn)橐粋€shell自己的變量可以通過export“導(dǎo)出”變成一個用戶變量。
[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程序來訪問和設(shè)置環(huán)境變量
使用下列三個函數(shù)來設(shè)置或訪問一個環(huán)境變量。
◆getenv()訪問一個環(huán)境變量。輸入?yún)?shù)是需要訪問的變量名字,返回值是一個字符串。如果所訪問的環(huán)境變量不存在,則會返回NULL。
◆setenv()在程序里面設(shè)置某個環(huán)境變量的函數(shù)。
◆unsetenv()清除某個特定的環(huán)境變量的函數(shù)。
有一個指針變量environ,它指向的是包含所有的環(huán)境變量的一個列表。下面的程序可以打印出當(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ān)的環(huán)境定義文件來修改環(huán)境變量,比如對于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,則顯示用戶自定義的錯誤信息value。4.echo${variablename:-value}如果未設(shè)置variablename,則顯示其值value。否則顯示原來值。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}……
:表示腳本傳入的的各個參數(shù),注意當(dāng)需表示兩位數(shù)以后的參數(shù)時數(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中定義。EXINITHOME echo${HOME}IFSLOGNAME echo$LOGNAME 獲取當(dāng)前登錄名set|grep‘LOG‘ 與之功能等價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’表示時區(qū)EDITORPWD eg:set|grep‘PWD’ 取得當(dāng)前目錄信息MANPATH eg:set|grep‘MANPATH’特殊變量$#: (傳遞到腳本的參數(shù)個數(shù))$*: (以一個單字符串顯示所有向腳本傳遞的參數(shù),與位置變量不同,此選項(xiàng)參數(shù)可超過9個)$$: (腳本運(yùn)行的當(dāng)前進(jìn)程ID號)$!: (后臺運(yùn)行的最后一個進(jìn)程的進(jìn)程ID)$@: (與$#相同,但是使用時加上引號,并在引號中返回每個參數(shù))$-: (顯示shell使用的當(dāng)前選項(xiàng),與set命令功能相同)$?: (顯示最后命令的退出狀態(tài)。0表示沒有錯誤,其它任何值表示有錯誤)影響變量的命令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)算符~,<<,>>,&,|,^$[]表示對方括號中的表達(dá)式進(jìn)行求值$[2^4] 例如:#!/bin/bash#$[]
表示舉例echo$[2+8]運(yùn)算符位運(yùn)算符運(yùn)算符說明~op1反運(yùn)算符,把op1中所有的二進(jìn)制位的1變?yōu)?,0變?yōu)?。op1<<op2左移運(yùn)算符,把op1中的二進(jìn)制位向左移動op2位,忽略最左端移出的各位,最右端的各位補(bǔ)上0值,每做一次按位左移就有實(shí)現(xiàn)op1乘以2op1>>op2右移運(yùn)算符,把op1中的二進(jìn)制位向右移動op2位,忽略最右端移出的各位,最左端的各位補(bǔ)上0值,每做一次按位右移就有實(shí)現(xiàn)op1除以2op1&op2與比較運(yùn)算符,比較op1和op2對應(yīng)位,對于每個二進(jìn)制位來說,如果二者該位都是1,則結(jié)果為1;否則,結(jié)果為0。op1^op2異或比較運(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 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)先級級別運(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輸入、輸出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從鍵盤或文件的某一行文本中讀入信息,并將其賦給一個變量命令格式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)輸出、輸入及錯誤在shell中執(zhí)行命令時,每個進(jìn)程都和三個打開的文件相關(guān)聯(lián),并使用文件描述符來引用這些文件。由于文件描述符不容易記憶,shell同時也給出了相應(yīng)的文件名。文件文件描述符輸入文件——標(biāo)準(zhǔn)輸入0(缺省是鍵盤,也可以是文件或其他命令的輸出)輸出文件——標(biāo)準(zhǔn)輸出1(缺省是屏幕,也可以是文件)錯誤輸出文件——標(biāo)準(zhǔn)錯誤2(缺省是屏幕,也可以是文件)文件重定向改變程序運(yùn)行的輸入來源和輸出地點(diǎn)1.command>filename把標(biāo)準(zhǔn)輸出重定向到一個新文件中2.command>>filename把標(biāo)準(zhǔn)輸出重定向到一個文件中(追加)3.command1>filename把標(biāo)準(zhǔn)輸出重定向到一個文件中4.command>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)行的輸入來源和輸出地點(diǎn)7.Command>>filename2>&1把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤一起重定向到一個文件中(追加)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錯誤輸出改向到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)建一個文件重定向標(biāo)準(zhǔn)輸入示例sort<file 將file文件中的數(shù)據(jù)作為輸入,sort對其進(jìn)行排序,然后將排序后的結(jié)果輸出到屏幕上sort<name.txt>name.out 第8種情況對排序后的內(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)錯誤示例:
[root@jackshell]#grep“trd”book.txtGrep:missiles:Nosuchfileordirectory[root@jackshell]#grep“trd”book.txt2>/dev/null解釋:表示把錯誤信息扔給/dev/null,/dev/null不會保存錯誤信息,實(shí)質(zhì)就是丟失錯誤信息。如果sky.txt不存在,則錯誤信息存入到一個指定的文件中,如: ls-alsky.txt2>err_message.txt文件重定向舉例結(jié)合使用標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯誤示例:
[root@jackshell]#cataccount_new.txt\Account_old.txt1>accounts.out2>accounts.err[root@jackshell]#cataccounts.out???[root@jackshell]#cataccounts.err???文件重定向舉例將2個文件的內(nèi)容重定向到accounts.out中,如果某一個文件不存在,或出錯,則將錯誤信息重定向到錯誤文件中accounts.err合并標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯誤示例:
合并的時候shell是從左到右分析相應(yīng)命令 grep“standard”standard.txt>grep.out2>&1->如果文件不存在,則把錯誤信息記錄到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)錯誤a.sh2>/dev/null組合重定向find.–name“*.log”>find.log2>&1練習(xí)echoreadcat管道 重點(diǎn)掌握tee文件重定向 重點(diǎn)掌握小結(jié)SHELL控制結(jié)構(gòu)條件測試shell的內(nèi)部命令里面有測試條件的語法test給ifwhile用testcondition
或者
[condition]條件測試文件狀態(tài)測試邏輯操作符字符串測試數(shù)值測試expr文件狀態(tài)測試格式: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,則為真字符串測試命令格式[操作符字符串][字符串操作符字符串]舉例[-z$EDITOR][$EDITOR=“vi”]操作符含義=相等!=不等-z空串-n非空串?dāng)?shù)值測試命令格式”數(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ù)值測試模式匹配條件測試-小結(jié)文件狀態(tài)測試邏輯操作符字符串測試數(shù)值測試expr控制流結(jié)構(gòu)流控制ifthenelse:條件測試case:匹配模式、單詞或值循環(huán)for循環(huán)until循環(huán)while循環(huán)ifthenelse語句語法格式:if條件1 then 命令1elif條件2 then 命令2else命令3fi示例:if["10"-lt"11"]thenecho"10islessthan11"fiifthenelse語句#!/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語句#!/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語句語法格式:case值in
模式1)
命令1 … ;;
模式2)
命令2 … ;;esac模式匹配: *表示任意字符 ?表示任意單個字符 [abc]
a、b或c三字符其中之一
[a-n]
從a到n的任一字符
|
多重選擇case語句#!/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)語法格式:for變量名in列表do
命令1
命令2 ……donefor循環(huán)#!/bin/sh#fortest1forloopin12345do echo$loopdone示例:#!/bin/sh#fortest2forloopin“isthisyourpen?”do echo$loopdone列表換為: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)語法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 后臺運(yùn)行程序休息3600秒while循環(huán)語法格式: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án),跳過本次循環(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“錯誤的輸入”
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“錯誤的輸入,是否繼續(xù)(y/n)?”
readIS_CONTINUE case$IS_CONTINUEin y|yes|Y|YES) continue ;;
*)
break ;;
esac esacdoneSHELL實(shí)例設(shè)計(jì)一個Shell程序,在/userdata目錄下建立50個目錄,即user1~user50,并設(shè)置每個目錄的權(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í)編寫一個菜單界面1:顯示當(dāng)前目錄下所有文件2:顯示當(dāng)前目錄下所有文件大小3:使用vi編輯器4:查看當(dāng)前系統(tǒng)中登陸的用戶q:退出菜單控制流結(jié)構(gòu)-小結(jié)流控制ifthenelse:條件測試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)成變量的返回對待!使用return返回腳本中函數(shù)調(diào)用的下一語句return:用最后狀態(tài)命令決定返回值return0:無錯誤返回return1:有錯誤返回函數(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
對任何操作系統(tǒng)而言,文本文件不具備直接執(zhí)行的功能。Dos系統(tǒng)通過賦予批處理文件(.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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 吉林省八年級數(shù)學(xué)下冊19矩形菱形與正方形19.1矩形19.1.1矩形的性質(zhì)聽評課記錄1新版華東師大版
- 小學(xué)二年級數(shù)學(xué)口算競賽試題
- 人教版地理七年級上冊《3.3降水的變化與分布》聽課評課記錄
- 北師大版歷史八年級下冊第14課《各民族的團(tuán)結(jié)與發(fā)展》聽課評課記錄
- 小學(xué)六年級數(shù)學(xué)下冊《面積的變化》聽評課記錄
- 人教版七年級道德與法治七年級上冊聽課評課記錄:第一單元成長的節(jié)拍第三課 發(fā)現(xiàn)自己第一課時認(rèn)識自己
- 公司員工廉潔自律協(xié)議書范本
- 二零二五年度汽車修理廠汽車美容與維修一體化服務(wù)合同
- 二零二五年度網(wǎng)絡(luò)劇導(dǎo)演專項(xiàng)聘用合同
- 二零二五年度肉類產(chǎn)品食品安全監(jiān)管合同協(xié)議
- 辦理工傷案件綜合應(yīng)用實(shí)務(wù)手冊
- 子宮內(nèi)膜異位癥診療指南
- 《高級計(jì)量經(jīng)濟(jì)學(xué)》-上課講義課件
- 《現(xiàn)代氣候?qū)W》研究生全套教學(xué)課件
- 護(hù)理診斷及護(hù)理措施128條護(hù)理診斷護(hù)理措施
- 情商知識概述課件
- 九年級物理總復(fù)習(xí)教案
- 【64精品】國標(biāo)蘇少版小學(xué)音樂六年級下冊教案全冊
- 天然飲用山泉水項(xiàng)目投資規(guī)劃建設(shè)方案
- 2019年重慶市中考物理試卷(a卷)及答案
- 信義玻璃參數(shù)表
評論
0/150
提交評論