linux shell scriptWord文件下载.docx
- 文档编号:18383343
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:71
- 大小:53.72KB
linux shell scriptWord文件下载.docx
《linux shell scriptWord文件下载.docx》由会员分享,可在线阅读,更多相关《linux shell scriptWord文件下载.docx(71页珍藏版)》请在冰豆网上搜索。
(0.3)本篇文章的架構
本來想用html來寫的,這樣似乎比較好,但是覺得有點麻煩,所
以還是用平常的格式來寫,各位假如用joe,那麼當看到(參考x.y)
時,你還是可以用ctrl-kf來尋找x.y的標題;
在vi下也可以用
/x.y來尋找,這樣也許也可以達到hypertext的效果吧......:
)
Chap1--簡介
Chap2--基本知識
Chap3--ShellProgramming中的資料表示
Chap4--ShellProgramming中的語法
Chap5--讀取資料及程式偵錯
附錄一--ShellSummary及一些ShellScript的例子
附錄二--grep簡介及regularexpressions
參考資料--介紹一些相關的書及資料
(0.4)假如你已經對BourneShellProgramming很熟......
那也許附錄一ShellSummary會對你有複習及快速參考的好處!
還有,參考資料中的書目,都是值得一看的書,假如你還沒看過,
那我想你可以參考看看.當然,man及grep的配合,也常常
可以助你一臂之力.
無疑的,UNIX是一個功能強大的作業系統,它多人多工特性,網路
的支援,多采多姿的XWindowsSystem,都相當的吸引人.除此之外
UNIX還有一項重要的特性,就是它提供了數以百計的命令.
每個人都知道,DOS下面也不過二三十個命令,這二三十個命令可能
一兩天就可以學的很好了;
但UNIX作業系統則不然,數百個命令就算
都學會了,若我們不知道如何去"
組合這些命令"
那我們將失去學習
UNIX的最大樂趣!
有人會覺得疑惑:
"
組合命令"
會有趣嗎?
什麼叫作"
?
這就是我們所要學習的.現在就舉一個最簡單的例子而言:
請計算目前
工作目錄下共有多少個普通檔案(RegularFile)?
當你遇到這樣的問題,你要如何解決?
有人會說:
我用ls-l列
出目前工作目錄下所有的檔案,然後慢慢的數......"
假如你用了
這樣的方法,而目前工作目錄下又有數百個檔案,那麼,我真的很敬
佩你"
愚公移山"
的精神.還有些人比較"
暴力"
他說:
這個嘛
很簡單,我寫一個C語言程式,用opendir,lstat等函數來計算
某一目錄下有多少個普通檔案......"
假如你要這樣做,那我當然不
反對,常練習寫程式也是不錯的.然而,就為了這麼小小的一個問題
而寫一段C語言的程式,未免太小題大作.實際上,解答的關鍵就
在:
你是不是會從數百個UNIX的命令中挑出適合的命令,然後把
這些命令組合起來,以達到我們所要的目的!
."
UNIX的每個命令
就好比各種不同的IC,每種IC都有它特殊的作用,藉由不同IC的
組合.我們可以達到我們所要的功能"
"
要達到目的的方法,常常
不是只有一種......"
上面這幾句話相當重要,各位現在也許還不清
楚.不過上面幾句話所提的,的確就是UNIX頗為吸引人的地方之一.
除了命令之外,Shell提供了一些類似一般程式語言的語法,我們可
以利用這些語法來寫程式.而這點也正是本篇文章的最主要內容.
(2.1)什麼是Shell?
我們可以把UNIX切成兩方面來看,一部份是系統的核心(kernel),
另一部份就是系統中的應用程式.舉凡我們常用的一些命令,像
ls,find與Shell一樣,都可被歸類為應用程式.所以,Shell
的地位與其它的應用程式並沒有什麼差別.
我們可以看看簽入UNIX作業系統的過程:
當我們輸入username之
後,getty就結束,取而代之的是login.在我們輸入正確的
password後,系統就依照/etc/passwd中的記錄,為使用者啟動
相對應的Shell.在這個時候,使用者就會得到一個提示符號.
接著我們就可以下達一些命令.
--getty-->
login-->
shell-->
logout--
^|
|------------------------------------------
Shell有另一個名稱叫做"
命令列直譯器"
(commandinterpreter)
從這個名稱當中,我們就可以了解到Shell實際上為命令列的翻譯官
當我們在提示符號後輸入一長串的命令,並按下Enter之後,Shell
就將我們所輸入的東西,做一個適當的分析及處理.
(2.2)Shell負責的事
對系統做交談性的使用.包含了輸出輸入導向(參考2.5),
管線(參考2.6)Wildcard的展開及匹配(參考2.4),另外
還有JobControl(從SVR4開始),變數環境設定?
.解譯命令....
還有一點很重要,Shell有它自己內建的程式語言,利用它的語法
我們可以來寫程式,寫出來程式功能並不像一般的程式語言(如C
語言)那麼多,然而,在很多情況下就夠用了.這部份也就是整
篇文章的重點.
(2.3)UNIX系統上Shell的種類
在DOS中,想必各位一定都知道它的Shell為.特別
要說明的是:
Shell是可以被置換掉的!
所以,許多人在DOS
中,常常把他們的Shell由換成,以得到
更多的功能,這已經是很平常的事了.在UNIX系統中也是一樣,
使用chsh這個命令,你可以挑你喜歡的Shell來使用.合法的
Shell清單被列在/etc/shells這個檔案中.
Shell的種類可以分為兩個支派,一為由BourneShell衍生而來的
包括了sh(BourneShell),ksh(KornShell),bash(Bourne
AgainShell),zsh(ZShell);
另一支派為CShell衍生而來的,
包括了csh,tcsh.現在許多人作業的環境常常是在csh或tcsh
之下,尤其是從BSD衍生而來SunOS的環境.
你可以使用echo$SHELL來獲知你現在到底使用那一種Shell.或
者直接看/etc/passwd的最後一個欄位.
(2.4)Wildcard的展開及匹配
Wildcard有些人把它翻譯成"
萬用字元"
下面所列舉的
項目,並不盡然每一種Shell都支援,各位要自己試試看.
(2.4.1)*:
代表任意的字串(字串可以是空的)
%ls
hahahaha1haha2memo1memo13memo2memo23
%lshaha*
hahahaha1haha2
%lsmemo*
memo1memo13memo2memo23
(2.4.2)?
:
代表任意一個字元
%ls
%lsmemo?
memo1memo2
%lsmemo1?
memo13
(2.4.3)[]:
代表符合[]中所列舉的字元
%lsmemo[12]
[a-e]bc會符合abc,bbc,cbc,dbc,ebc
(2.4.4)[!
]:
[]中的字元,若加了!
則表示不符合[]中所列舉的字元
%lsmemo[!
1]
memo2
[!
a-z]bc會符合不是以小寫英文字母開頭,後面接著bc
的字串.如會符合:
Cbc,6bc等......
(2.4.5){word1,word2....}:
如my_{dog,cat,pig}會符合my_dog
my_cat,my_pig
(2.4.6)\:
接在\之後的特殊字元,其特殊的意義會被取消
例如,有一個檔案,它的名字真的叫*abc,那我們得用
cat\*abc才能把*abc中的內容顯示出來.
(2.4.7)更多關於Wildcard的討論:
(I)glob:
這種Wildcard匹配的動作,我們稱為"
globbing"
在很多種Shell之中都有一個叫作noglob的變數,可以把
Wildcard展開匹配的動作關掉.
%ls*bc
abcbbccbcdbc
%setnoglob<
--CShell中設定變數的方法
(設定變數參考2.7)
ls:
*bc:
Nosuchfileordirectory
(II)*不會包含.開頭的檔案,要符合以.為開頭的檔案,你
可以試試.?
?
*或.[!
\.]*(ForNewerBourneShell)
.[^.]*(Fortcsh)
(2.5)輸出輸入導向
(2.5.1)StandardInput,StandardOutputandStandardError
在某方面來說,把資料寫到一個檔案中與寫到終端機並沒有什麼差別
相同的,把資料從檔案中讀出與從鍵盤讀出亦沒有什麼差別.
在UNIX系統中,標準輸出輸入(StandardI/O)提供了一些預設
的輸出輸入設備,這些就是stdin,stdout,以及stderr.
stdin:
一般說來,就是來自你鍵盤的輸入,但許多情況下,程式
常忽略了stdin,而直接在命令列的參數中拿.如:
cathaha.haha就可以當做stdin.
stdout:
正常訊息輸出,預設是終端機.
stderr:
錯誤訊息輸出,與stdout一樣,預設是終端機.
stdin的檔案描述值(filedescriptornumber)是0,
stdout是1,stderr是2.
(2.5.2)輸出輸入導向
舉一個最簡單的例子,我們用ls-la可列出目前目錄下所有的
內容.然而,若我們想要把終端機上的輸出放到一個檔案中,
那我們要如何做呢?
這時候,我們就要把原來終端機上的輸出
(也就是預設的標準輸出)導向至一個檔案.我們可以這樣作:
ls-la>
output_file
這個>
的符號就是導向符號.
下表是一般經常看到的輸出輸入導向,prog就是program的意思
而file就是一個檔案:
功能sh,ksh,bashcsh,tcsh
--------------------------------------------------------------
把標準輸出導到一個檔案prog>
fileprog>
file
把標準輸出導到檔案描述值nprog>
&
n
把原來輸出至檔案描述值mprogm>
的輸出與輸出至檔案描述值n
的輸出,一起導向至檔案描
述值n
把標準錯誤輸出導到一個檔案prog2>
把標準輸出關閉prog>
-
把標準輸出以及標準錯誤輸出prog>
file2>
1prog>
導到一個檔案
把標準輸出導到f1,把標準(prog>
f1)2>
f2(prog>
f1)>
f2
錯誤輸出導到f2
把標準輸出導到一個檔案的後面prog>
>
把標準錯誤輸出導到一個檔案的prog2>
後面
把標準輸出以及標準錯誤輸出導prog>
到一個檔案的後面
把檔案當作標準輸入prog<
fileprog<
從檔案描述值n的地方讀取prog<
當作prog的輸入
把標準輸入關閉prog<
把file1當成prog的標準prog<
file1>
file2
輸入,並把標準輸出的結果
再導向至file2
從鍵盤的輸入當作stdin,直prog<
<
w>
who_log
把w這個指令的輸出導到一個叫做who_log的檔案
catfile1>
file2
^^^^^^^^^
把catfile1的輸出導到一個叫做file2的檔案
(II)prog2>
先寫一個叫做test1.c的C語言程式如下:
#include
voidmain(void)
{
print("
StandardErrorTest"
);
/*故意寫錯*/
}
接著輸入cctest1.c<
--compiletest1.c
這時我們會看到類似下面的錯誤訊息:
/tmp/cca006131.o(.text+0x1e):
undefinedreferenceto`print'
從上面的情況中,我們可以看到,這個C語言程式只有一個錯誤
所以得到的錯誤訊息也不多.然而,我們若compile一個很大的
程式,錯誤也許會有數百個也不一定,這時候,若我們不採用把
錯誤輸出導向到檔案的方法,那麼錯誤訊息在終端機上立刻就捲出
去了,使用者就無法看的完全.比較好的方法是把錯誤訊息導到
一個檔案中再慢慢分析比較好.所以這時候我們應該這樣做:
cctest1.c2>
errmsg
此時,原本在終端機上的錯誤輸出就會被導到errmsg這個檔案中
還有,prog2>
/dev/null可以抑制錯誤訊息的輸出,因為它把
標準錯誤輸出導到/dev/null這個垃圾桶中,這個功能與上面的
prog>
-有相同的地方,本來應該輸出的訊息都被壓抑了.只
不過一個是抑制錯誤訊息輸出,一個是抑制正常訊息輸出.不過
prog2>
-就可以達到與prog2>
/dev/null相同的效果.
(III)prog>
1
我們可以試試下面的命令:
find/-size+2000k>
~/output2>
接著你可以在你的HomeDirectory下找到output這個檔案,你
可以看看它的內容.你就會發覺,有些目錄對你來說是
Permissiondenied的,這些都是錯誤訊息的輸出.你也會看到
有些檔案名,這些檔案都是大於2000k的,屬於正常訊息的輸出
所以,output這個檔案的確包含著標準輸出以及標準錯誤輸出的
訊息.
**注意!
SunOS上的find是以block為單位,所以,假
如你在SunOS上操作,那請把+2000k的k去掉,如下:
find/-size+2000>
(IV)(prog>
f2
再一次的,我們用上面的命令,但改為:
(find/-size+2000k>
~/normal_out)2>
/tmp/error_out
在(III)中,我們把正常訊息的輸出與錯誤訊息的輸出都混在
~/output這個檔案中.從某個角度來說,這不是很好的作法,
我們所希望的,是把正常訊息的輸出放在一個檔案,而錯誤
訊息的輸出放到另一個檔案.此時,我們就要採用(IV)這個
方法.在上面的命令中,我們把find這個命令的正常訊息輸出
導到~/normal_out這個檔案,而錯誤訊息輸出我們就把它導到
/tmp/error_out這個檔案中.
(V)至於prog>
file,prog2>
file,prog>
與prog>
只是把>
換成>
而它的差別就只在:
>
是"
附加"
的意思
並不像>
會把原來導向過去的檔案清除(假如欲導向過去的檔案
已經存在,而且noclobber變數沒有被設定的話!
當然,若原來
檔案不存在,那就會製造出新的檔案)
所以,試試看下面的命令就可明白:
ls-la/usr>
file1
ls-la/etc>
catfile1<
--你看到的是/etc下的內容
接著,再試試
file2<
--把輸出的結果"
在file2後
catfile2<
--你看到的是/usr與/etc下所有的內容
(VI)prog<
有些命令,它要處理的內容是要由標準輸入中拿的.如mail這
個命令,若我們在提示符號下鍵入mailabc@cc.nctu.edu.tw
此時,我們就得由鍵盤上輸入一些資料,最後按Ctrl-d作為結
束.此時,我們剛剛輸入的資料就會經過mail處理寄出電子郵
件.然而,這樣作的壞處是,萬一你打錯了字想修改前面幾列
的內容,就變得困難了.所們所希望的,是信件的內容先用
普通好用的文書編輯器寫好,再把寫好的東西寄出去.此時,<
就派上用場,我們就把寫好的檔案當作是從標準輸入給與的內容
導向給prog.所以mailabc@cc.nctu.edu.tw<
report
report就
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux shell script