?? unix的批處理 shell script.htm
字號(hào):
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>UNIX的批處理 Shell Script</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="Microsoft Border" content="none">
</head>
<body background="../images/waybkgnd.gif" text="#C0C0C0" link="#00FF00" vlink="#C0C0C0">
<font SIZE="2">
<p></font><font size="6" color="#0080FF"><u><strong>UNIX的批處理 Shell Script</strong></u></font></p>
<pre>講師:蔡孟光
———————————————————————————
<<<版權(quán)聲明>>>
本著作物版權(quán)屬於國(guó)立臺(tái)灣大學(xué)電子計(jì)算機(jī)中心。為了推廣網(wǎng)路的使用,除了下列的限
制之外,任何人均可以任何型式復(fù)制或修改這份講義。
一、不得有任何的商業(yè)行為
二、復(fù)制或修改這份講義時(shí),必須將本版權(quán)聲明列入,并注明之
三、國(guó)立臺(tái)灣大學(xué)電子計(jì)算機(jī)中心不對(duì)修改過(guò)後的內(nèi)容負(fù)任何的責(zé)任
———————————————————————————
<<<目錄>>>
□前言
□將文字檔設(shè)為可執(zhí)行的Shell Script
□Script的基本結(jié)構(gòu)及觀念
□Bourne Shell
一、變數(shù)
二、執(zhí)行命令
三、流程控制
□C Shell
一、變數(shù)
二、執(zhí)行命令
三、流程控制</pre>
<pre>□附錄A expr命令
□附錄B test命令
</pre>
<pre>□前言</pre>
<pre> 在DOS 中,你可能會(huì)從事一些例行的重覆性工作,此時(shí)你會(huì)將這些重覆性的命令寫(xiě)
成批次檔,只要執(zhí)行這個(gè)批次檔就等於執(zhí)行這些命令。大家會(huì)問(wèn)在UNIX中是否有批次處
理這個(gè)東東,答案是有的。在UNIX中不只有如DOS 的批次處理,它的功能比起DOS 更強(qiáng)
大,相對(duì)地也較復(fù)雜,已經(jīng)和一般的高階語(yǔ)言不相上下。在UNIX中大家都不叫做批次檔
,而叫做Shell Script。</pre>
<pre> 一般而言,Shell Script的地位和其它的可執(zhí)行檔(或命令)是完全相同的,只不
過(guò)Shell Script是以文字檔的方式儲(chǔ)存,而非二進(jìn)位檔。而執(zhí)行Shell Script時(shí),必須
有一個(gè)程式將其內(nèi)容轉(zhuǎn)成一道道的命令執(zhí)行,而這個(gè)程式其實(shí)就是Shell ,這也就是為
什麼我們叫做Shell Script的原因(往後我們稱為Script)。不同Shell 的Script基本
上會(huì)有一些差異,所以我們不能將寫(xiě)給A shell 的Script用B shell 執(zhí)行。而在UNIX中
大家最常使用Bourne Shell以及C Shell ,所以這堂課就介紹這兩種Script的寫(xiě)法。
</pre>
<pre>□將文字檔設(shè)為可執(zhí)行的Shell Script</pre>
<pre> 如果我們已經(jīng)寫(xiě)好Script,如何將其設(shè)成可執(zhí)行檔呢?因?yàn)镾cript其實(shí)是一個(gè)可執(zhí)
行檔,所以必須將其存取權(quán)設(shè)定成可執(zhí)行。我們可以使用下列命令更改存取權(quán):</pre>
<pre> chmod u+x filename 只有自己可以執(zhí)行,其它人不能執(zhí)行
chmod ug+x filename 只有自己以及同一群可以執(zhí)行,其它人不能執(zhí)行
chmod +x filename 所有人都可以執(zhí)行</pre>
<pre> 而我們?nèi)绾沃付ㄊ褂媚且粋€(gè)Shell 來(lái)解釋所寫(xiě)的Script呢?幾種基本的指定方式如
下所述:
1. 如果Script的第一個(gè)非空白字元不是"#",則它會(huì)使用Bourne Shell。
2. 如果Script的第一個(gè)非空白字元是"#"時(shí),但不以"#!"開(kāi)頭時(shí),則它會(huì)使用C Shell。
3. 如果Script以"#!"開(kāi)頭,則"#!"後面所寫(xiě)的就是所使用的Shell,而且要將整個(gè)路徑
名稱指出來(lái)。</pre>
<pre> 名稱指出來(lái)。
這里建議使用第三種方式指定Shell ,以確保所執(zhí)行的就是所要的。Bourne Shell的路
徑名稱為/bin/sh ,而C Shell 則為/bin/csh。</pre>
<pre> <eg>
1. 使用Bourne Shell
┌——————————┐ ┌——————————┐
│echo enter filename │ │#!/bin/sh │
│ . │ or │ . │
│ . │ │ . │
│ . │ │ . │
└——————————┘ └——————————┘</pre>
<pre> 2. 使用C Shell
┌——————————┐ ┌——————————┐
│# C Shell Script │ │#!/bin/csh │
│ . │ │ . │
│ . │ │ . │
│ . │ │ . │
└——————————┘ └——————————┘</pre>
<pre> 3. 使用/etc/perl
┌——————————┐
│#! /etc/perl │
│ . │
│ . │
│ . │
└——————————┘</pre>
<pre> 除了在Script內(nèi)指定所使用的Shell 外,你也可以在命令列中強(qiáng)制指定。比如你要
用C Shell 執(zhí)行某個(gè)Script,你可以下這個(gè)命令:</pre>
<pre> csh filename</pre>
<pre>此時(shí)的Script的存取權(quán)就不一定要為可執(zhí)行檔,其內(nèi)部所指定的Shell 也會(huì)無(wú)效,詳細(xì)
的情形後面會(huì)討論。
</pre>
<pre>□Script的基本結(jié)構(gòu)及觀念</pre>
<pre> Script是以行為單位,我們所寫(xiě)的Script會(huì)被分解成一行一行來(lái)執(zhí)行。而每一行可
以是命令、注解、或是流程控制指令等。如果某一行尚未完成,可以在行末加上"\" ,
這個(gè)時(shí)候下一行的內(nèi)容就會(huì)接到這一行的後面,成為同一行,如下
┌———————————┐
│echo The message is \ │
│too long so we have \ │
│to split it into \ │
│several lines │
└———————————┘
當(dāng)Script中出現(xiàn)"#" 時(shí),再它後面的同一行文字即為注解,Shell 不會(huì)對(duì)其翻譯。
在Script中要執(zhí)行一個(gè)命令的方法和在命令列中一樣,你可以前景或背景執(zhí)行,執(zhí)
行命令時(shí)也會(huì)需要設(shè)定一些環(huán)境變數(shù)。
Script的流程控制和一般高階語(yǔ)言的流程控制沒(méi)有什麼兩樣,也和高階語(yǔ)言一樣有
副程式。這些使得Script的功能更加強(qiáng)大。
為了達(dá)到與高階語(yǔ)言相同的效果,我們也可以在Script中設(shè)定變數(shù),如此使Script
成為一個(gè)名付其實(shí)的高階語(yǔ)言。
</pre>
<pre>□Bourne Shell</pre>
<pre>一、變數(shù)</pre>
<pre> Bourne Shell的變數(shù)型態(tài)只有字串變數(shù),所以要使用數(shù)值運(yùn)算則必須靠外部命令達(dá)
成目的。而其變數(shù)種類有下列幾種:</pre>
<pre> 1. 使用者變數(shù)
這是最常使用的變數(shù),我們可以任何不包含空白字元的字串來(lái)當(dāng)做變數(shù)名稱。
設(shè)定變數(shù)值時(shí)則用下列方式:</pre>
<pre> var=string</pre>
<pre> 取用變數(shù)時(shí)則在變數(shù)名稱前加上一"$" 號(hào)。</pre>
<pre> <eg>
┌———————┐
│name=Tom │
│echo name │
│echo $name │
└———————┘
結(jié)果如下:
name
Tom</pre>
<pre> 2. 系統(tǒng)變數(shù)(環(huán)境變數(shù))
和使用者變數(shù)相似,只不過(guò)此種變數(shù)會(huì)將其值傳給其所執(zhí)行的命令。要將一使
用者變數(shù)設(shè)定為系統(tǒng)變數(shù),只要加上:</pre>
<pre> export var</pre>
<pre> <eg>
┌———————┐
│name=Tom │
│export name │
└———————┘</pre>
<pre> 以下是使用者一進(jìn)入系統(tǒng)之後就已設(shè)定好的系統(tǒng)變數(shù):</pre>
<pre> $HOME 使用者自己的目錄
$PATH 執(zhí)行命令時(shí)所搜尋的目錄
$TZ 時(shí)區(qū)
$MAILCHECK 每隔多少秒檢查是否有新的信件
$PS1 在命令列時(shí)的提示號(hào)
$PS2 當(dāng)命令尚未打完時(shí),Shell 要求再輸入時(shí)的提示號(hào)
$MANPATH man 指令的搜尋路徑</pre>
<pre> 3. 唯讀的使用者變數(shù)
和使用者變數(shù)相似,只不過(guò)這些變數(shù)不能被改變。要將使用者變數(shù)設(shè)成唯讀的
,只要加上:</pre>
<pre> readonly var</pre>
<pre> 而若只打readonly則會(huì)列出所有唯讀的變數(shù)。還有一點(diǎn),系統(tǒng)變數(shù)不可以設(shè)定
成唯讀的。</pre>
<pre> <eg>
┌———————┐
│name=Tom │
│readonly name │
│echo $name │
│name=John │
│readonly │
└———————┘
結(jié)果如下:
Tom
name: is read only
readonly name
readonly ......</pre>
<pre> 4. 特殊變數(shù)
有些變數(shù)是一開(kāi)始執(zhí)行Script時(shí)就會(huì)設(shè)定,并且不以加以修改,但我們不叫它
唯讀的系統(tǒng)變數(shù),而叫它特殊變數(shù)(有些書(shū)會(huì)叫它唯讀的系統(tǒng)變數(shù)),因?yàn)檫@
些變數(shù)是一執(zhí)行程式時(shí)就有了,況且使用者無(wú)法將一般的系統(tǒng)變數(shù)設(shè)定成唯讀
的。以下是一些等殊變數(shù):</pre>
<pre> $0 這個(gè)程式的執(zhí)行名字
$n 這個(gè)程式的第n個(gè)參數(shù)值,n=1..9
$* 這個(gè)程式的所有參數(shù)
$# 這個(gè)程式的參數(shù)個(gè)數(shù)
$$ 這個(gè)程式的PID
$! 執(zhí)行上一個(gè)背景指令的PID
$? 執(zhí)行上一個(gè)指令的返回值</pre>
<pre> 當(dāng)你執(zhí)行這個(gè)程式時(shí)的參數(shù)數(shù)目超過(guò)9 個(gè)時(shí),我們可以使用shift 命令將參數(shù)
往前移一格,如此即可使用第10個(gè)以後的參數(shù)。除此之外,吾人可以用set 命
令改變$n及$*,方法如下:</pre>
<pre> set string</pre>
<pre> 如此$*的值即為string,而分解後則會(huì)放入$n。如果set 命令後面沒(méi)有參數(shù),
則會(huì)列出所有已經(jīng)設(shè)定的變數(shù)以及其值。</pre>
<pre> <eg>
檔名:ex1 參數(shù):this is a test
┌———————————┐
│echo Filename: $0 │
│echo Arguments: $* │
│echo No. of args.: $# │
│echo 2nd arg.: $2 │
│shift │
│echo No. of args.: $# │
│echo 2nd arg.: $2 │
│set hello, everyone │
│echo Arguments: $* │
│echo 2nd arg.: $2 │
└———————————┘
結(jié)果如下:
Filename: ex1
Arguments: this is a test
No. of args.: 4
2nd arg.: is
No. of args.: 3
2nd arg.: a
Arguments: hello, everyone
2nd arg.: everyone</pre>
<pre> 值得一提的是,當(dāng)你想從鍵盤輸入一變數(shù)值時(shí),你可以使用下面的命令:</pre>
<pre> read var1 var2.....</pre>
<pre> 這時(shí)read會(huì)將一個(gè)字分給一個(gè)變數(shù)。如果輸入的字比變數(shù)還多,最後一個(gè)變數(shù)會(huì)將
剩下的字當(dāng)成其值。如果輸入的字比變數(shù)還少,則後面的變數(shù)會(huì)設(shè)成空字串。
如果需要處理數(shù)值運(yùn)算,我們可以使用expr命令。其參數(shù)及輸出列於附錄A。
</pre>
<pre>二、執(zhí)行命令</pre>
<pre> 在Bourne Shell中有五種方法執(zhí)行一個(gè)命令,而這五種方式所產(chǎn)生的果有些許的不
同。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -