- 論壇徽章:
- 0
|
POSIX SHELL PROGRAMMING
作者:eagle
目 錄
第一章 介紹POSIX SHELL Scripts 2
§1-1什么是shell腳本 4
§1-2 script的執(zhí)行 6
§1-3外部環(huán)境對(duì)于腳本的影響 8
§1-5在回車之后會(huì)發(fā)生什么? 14
第一章 介紹POSIX SHELL Scripts
本章目標(biāo)
閱讀完本章之后,你可以完成以下工作:
l 描述如何創(chuàng)建一個(gè)POSIX shell script
l 描述shell如何去處理命令
l 解釋shell如何去執(zhí)行命令
l 描述一些內(nèi)部因素對(duì)腳本執(zhí)行的影響
l 編寫一個(gè)shell腳本
l 復(fù)習(xí)POSIX shell的特性
§1-1什么是shell腳本
什么是shell腳本?
l 一種含有UNIX命令的text文件
l 一種可以被閱讀和執(zhí)行的text文件
l 一種可以被shell解釋和執(zhí)行的程序
l 一種可以自動(dòng)執(zhí)行UNIX任務(wù)的工具
l 一種不需要編譯的程序
l 一種易于創(chuàng)建和編輯的程序
此書的首要目的是教你如何去編寫POSIX shell腳本。
什么是shell腳本?簡(jiǎn)單地說(shuō),shell腳本就是一種包含有一個(gè)或多個(gè)unix命令的可執(zhí)行的text類型的文件。Shell腳本不需要編譯就可以直接執(zhí)行。POSIX shell就是把shell腳本中的文本文件解釋成在unix中可以執(zhí)行的命令。
大多數(shù)的shell腳本用于自動(dòng)處理一些反復(fù)的、令人煩躁的或者需要長(zhǎng)時(shí)間等待程序執(zhí)行的命令。(例如:文件備份、硬盤mirror等)shell的腳本用于守護(hù)進(jìn)程中十分有用。在本書的后面將詳細(xì)介紹。
Shell腳本可以是一行簡(jiǎn)單的命令也可以是上千行命令。
但你掌握了POSIX shell編程以后會(huì)覺得它是非常簡(jiǎn)單和輕松的。這本書將提供一系列手把手的關(guān)于shell編程以及它所使用的工具的實(shí)例幫你掌握這門語(yǔ)言。
§1-2 script的執(zhí)行
l Script的執(zhí)行
執(zhí)行script所需要的步驟:
Ø 建立一個(gè)最少包含有一個(gè)命令的text文檔
Ø 保存文檔
Ø 賦予文檔執(zhí)行的權(quán)限
Ø 執(zhí)行該文檔
建立你的第一個(gè)script程序:
1.建立一個(gè)包含有一個(gè)或多個(gè)命令的文本文件,保存后退出。例如下面的文檔myprog.sh
vi myprog.sh
banner “hello world”
date
:wq
2. 賦予該文件執(zhí)行的權(quán)限
chmod u+x myprog.sh
3. 執(zhí)行該shell腳本
./myprog.sh
課后練習(xí):
1.編寫一個(gè)名為p1.sh的shell腳本輸出顯示以下內(nèi)容:
Ø 標(biāo)題“Procs”( 使用banner命令)
Ø 系統(tǒng)所有進(jìn)程的列表(使用ps命令)
2.編寫一個(gè)名為p2.sh的shell腳本輸出顯示以下內(nèi)容:
Ø 系統(tǒng)的名稱(用hostname命令)
Ø 系統(tǒng)日志文件的最后10行文字
(使用tail命令,系統(tǒng)日志文件為/var/adm/syslog/syslog.log)
3. 編寫一個(gè)名為p3.sh的shell腳本輸出顯示一下內(nèi)容:
Ø 所有在線用戶的排序列表(使用who,cut –c1-8和sort命令)
§1-3外部環(huán)境對(duì)于腳本的影響
外部環(huán)境對(duì)于腳本的影響
l 登陸方法
Ø 采用telnet方式直接遠(yuǎn)程登陸
Ø CDE從本地或遠(yuǎn)程采用x-windows登陸 (CDE?)
Ø 從console登陸
l 根目錄上的啟動(dòng)配置文件
Ø .profile
Ø .dtprofile
l 系統(tǒng)默認(rèn)配置(由系統(tǒng)管理員管理)
Ø /etc/PATH
Ø /etc/passwd
shell腳本執(zhí)行時(shí)所處的環(huán)境會(huì)對(duì)shell腳本如何執(zhí)行和執(zhí)行的結(jié)果都會(huì)產(chǎn)生影響。
登陸時(shí)所采用的方式會(huì)對(duì)環(huán)境產(chǎn)生一定的影響。不同的登陸方式會(huì)啟動(dòng)不同的配置文件,從而會(huì)改變shell的一些設(shè)定。
登陸方式 啟動(dòng)的配置文件
Telnet方式遠(yuǎn)程登陸 .profile和shell的啟動(dòng)文件
CDE方式登陸 .dttprofile (和.profile一樣)
從console登陸 .profile和shell的啟動(dòng)文件
這些啟動(dòng)文件可以設(shè)置shell的特性,命令的路徑,shell變量,提示符號(hào)和一些基本的關(guān)于shell的性能特性。
你必須對(duì)這些文件和他們的用途比較熟悉。
下面的內(nèi)容是對(duì)這些文件的簡(jiǎn)單描述:
環(huán)境變量
在本章的后面將詳細(xì)的介紹這些變量。環(huán)境變量廣泛應(yīng)用在應(yīng)用程序,系統(tǒng)程序和shell中。
當(dāng)用戶登陸時(shí),shell將完成一系列的環(huán)境變量的設(shè)定。這些變量將會(huì)傳遞給子進(jìn)程。
系統(tǒng)和用戶進(jìn)程利用環(huán)境變量的設(shè)定確定以下內(nèi)容:
Ø 用戶的根目錄地址
Ø 用戶使用的顯示控制接口
Ø shell執(zhí)行文件的路徑
以下是一些環(huán)境變量的例子:
HOME=/home/user1
……
PATH=/usr/bin:/usr/css/bin:……
……
SHELL=/usr/bin/sh
……
TERM=dtterm
根目錄下的.profile文件包含了shell環(huán)境的設(shè)置。環(huán)境配置文件有很多不同的名字,但一般名字的結(jié)尾都是rc。
例如:
ENV=~/.sh
Export ENV
Shell腳本文件可以包含以下各項(xiàng)(后面的章節(jié)中將詳細(xì)討論)
Ø 命令別名(可以給UNIX命令制定一個(gè)別名)
Ø shell的設(shè)定(設(shè)置shell的一些特殊屬性)
Ø shell變量(設(shè)定變量只在當(dāng)前shell中有效)
Ø 功能函數(shù)(與shell腳本類似,但函數(shù)只存在于當(dāng)前shell中)
例如:
set -o vi
set -o noclobber
alias more=/usr/bin/more
alias h=history
alias c=clear
別名
別名是UNIX命令的另一個(gè)名字。
別名使用如下的語(yǔ)法結(jié)構(gòu):
alias alias_name = command_text_string
alias_name就是創(chuàng)建的別名,command_text_string就是其對(duì)應(yīng)的UNIX命令。當(dāng)alias_name在shell腳本中出現(xiàn)時(shí)就調(diào)用相應(yīng)的Unix命令。 例如:
alias dir=ls
以后,如果你使用dir命令就和ls是一樣的功能。(如果你習(xí)慣用dir來(lái)列出文件的話)。
如果要看有哪些別名是已經(jīng)存在的,可以使用命令:
alias
一些別名是已經(jīng)默認(rèn)設(shè)置于POSIX shell中的,可以使用戶更方便的使用UNIX命令。
Shell設(shè)定
通過(guò)set命令可以控制POSIX shell中一些功能的開啟(sh-posix的幫助文當(dāng)中有詳細(xì)的介紹)。
啟動(dòng)功能采用set -o 參數(shù),關(guān)閉功能采用set +o 參數(shù)。
一些有用的設(shè)定如下:
set -o ignoreoef #取消ctrl+D替代exit命令的功能
set -o noclobber #阻止復(fù)位向時(shí)覆蓋文件
set -o vi #用vi編輯器編輯命令行
關(guān)閉設(shè)定,用如下的語(yǔ)法:
set +o ignoreoef #允許ctrl+D替代exit命令
set +o noclobber #復(fù)位向時(shí)允許覆蓋文件
set +o vi #不使用vi編輯器編輯命令行
功能函數(shù)
功能函數(shù)在.shrc文件中被聲明(功能函數(shù)將在后面的章節(jié)中詳細(xì)的說(shuō)明)。
§1-4在回車之后會(huì)發(fā)生什么?
回車之后會(huì)發(fā)生什么?
l shell解釋你的命令行
l shell執(zhí)行一些替換
l shell在內(nèi)存中裝載你的命令
l shell建立I/O的重定向
l shell執(zhí)行你的命令程序
l shell等待你程序執(zhí)行結(jié)束
l shell等待下一條命令
當(dāng)用戶輸入命令按回車之后,shell在執(zhí)行命令之前會(huì)先解釋該命令。當(dāng)shell執(zhí)行腳本文件時(shí)也是相同的順序。
命令執(zhí)行的次序是相當(dāng)重要的。如果你違反了執(zhí)行的次序?qū)?huì)得到意想不到的結(jié)果。下面將幫助你了解shell執(zhí)行的次序。為了更清楚,一些關(guān)于shell關(guān)鍵字的內(nèi)部控制命令已經(jīng)得到了簡(jiǎn)化。
Shell 處理過(guò)程
1.Shell首先從命令行中找出特殊字符(元字符),在將元字符翻譯成間隔符號(hào)。元字符將命令行劃分成小塊tokens。Shell中的元字符如下所示:
SPACE , TAB , NEWLINE , & , ; , ( , ) ,< , > , |
2. 程序塊tokens被處理,檢查看他們是否是shell中所引用到的關(guān)鍵字。
3. 當(dāng)程序塊tokens被確定以后,shell根據(jù)aliases文件中的列表來(lái)檢查命令的第一個(gè)單詞。如果這個(gè)單詞出現(xiàn)在aliases表中,執(zhí)行替換操作并且處理過(guò)程回到第一步重新分割程序塊tokens。
4.Shell對(duì)~符號(hào)進(jìn)行替換。
5.Shell對(duì)所有前面帶有$符號(hào)的變量進(jìn)行替換。
6.Shell將命令行中的內(nèi)嵌命令表達(dá)式替換成命令;他們一般都采用$(command)標(biāo)記法。
7.Shell計(jì)算采用$(expression)標(biāo)記的算術(shù)表達(dá)式。
8.Shell將命令字符串重新劃分為新的塊tokens。這次劃分的依據(jù)是欄位分割符號(hào),稱為IFS。缺省的IFS變量包含有:SPACE , TAB 和換行符號(hào)。
9.Shell執(zhí)行通配符* ? [ ]的替換。
10.shell把所有從處理的結(jié)果中用到的注釋刪除,並且按照下面的順序?qū)嵭忻畹臋z查:
A. 內(nèi)建的命令
B. shell函數(shù)(由用戶自己定義的)
C. 可執(zhí)行的腳本文件(需要尋找文件和PATH路徑)
11.在執(zhí)行前的最后一步是初始化所有的輸入輸出重定向。
12.最后,執(zhí)行命令。
最后執(zhí)行的命令的形式可能與開始時(shí)敲進(jìn)去的命令形式大不相同。這就是POSIX shell的強(qiáng)大之處:非常簡(jiǎn)短的指令可以產(chǎn)生不同凡響的結(jié)果。
課后練習(xí):
執(zhí)行下面的代碼并揭示其產(chǎn)生的結(jié)果:
print *
print '*'
print My login name is $(whoami)
whence -v type
type if
type whereis
whereis print
type print
alias
§1-5 子shell進(jìn)程環(huán)境
子shell進(jìn)程環(huán)境
運(yùn)行POSIX shell進(jìn)程的主要組成部分為:
Ø 程序源代碼,即text文檔
Ø 所需的數(shù)據(jù),分為局部變量和環(huán)境變量?jī)刹糠?br />
當(dāng)一條命令執(zhí)行時(shí)帶有POSIX shell 參數(shù)時(shí),就會(huì)啟動(dòng)一個(gè)子進(jìn)程來(lái)執(zhí)行這條命令。下面描述的就是調(diào)用和執(zhí)行的次序:
1.Shell首先通過(guò)調(diào)用系統(tǒng)函數(shù)fork( )拷貝一份自己作為子進(jìn)程。被創(chuàng)建的shell進(jìn)程稱為子進(jìn)程,相應(yīng)的創(chuàng)建進(jìn)程稱之為父進(jìn)程。
2.當(dāng)子shell進(jìn)程運(yùn)行時(shí),父進(jìn)程處于休息等待狀態(tài)。
3.子shell進(jìn)程可以調(diào)用父進(jìn)程中的環(huán)境變量,但不能夠調(diào)用局部變量。
4.
5. 當(dāng)子進(jìn)程執(zhí)行完成時(shí),他會(huì)返回一個(gè)整型得狀態(tài)參數(shù)值給等待它的父進(jìn)程。
6.父進(jìn)程被喚醒,并且將子進(jìn)程所返回的紙包存在一個(gè)特殊的變量$?中。父進(jìn)程可以用這個(gè)變量來(lái)監(jiān)測(cè)子進(jìn)程是否執(zhí)行成功。
課后練習(xí)
執(zhí)行下面的命令并借時(shí)執(zhí)行后的結(jié)果:
Instruction execute Explain the results
Start a child ksh
Show the processes ps -f
Terminate the child exit
Display the result print $?
Start a new child ksh
Show the processes ps -f
Terminate the child exit 1
Display the result print $?
§1-6 POSIX shell 特點(diǎn)總結(jié)
l |
|