⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unix的批处理 shell script.htm

📁 很好的参考书
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<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>讲师:蔡孟光
———————————————————————————
&lt;&lt;&lt;版权声明&gt;&gt;&gt;
本著作物版权属於国立台湾大学电子计算机中心。为了推广网路的使用,除了下列的限
制之外,任何人均可以任何型式复制或修改这份讲义。
一、不得有任何的商业行为
二、复制或修改这份讲义时,必须将本版权声明列入,并注明之
三、国立台湾大学电子计算机中心不对修改过後的内容负任何的责任
———————————————————————————
&lt;&lt;&lt;目录&gt;&gt;&gt;
□前言
□将文字档设为可执行的Shell Script
□Script的基本结构及观念
□Bourne Shell
  一、变数
  二、执行命令
  三、流程控制
□C Shell
  一、变数
  二、执行命令
  三、流程控制</pre>

<pre>□附录A    expr命令
□附录B    test命令
</pre>

<pre>□前言</pre>

<pre>    在DOS 中,你可能会从事一些例行的重覆性工作,此时你会将这些重覆性的命令写
成批次档,只要执行这个批次档就等於执行这些命令。大家会问在UNIX中是否有批次处
理这个东东,答案是有的。在UNIX中不只有如DOS 的批次处理,它的功能比起DOS 更强
大,相对地也较复杂,已经和一般的高阶语言不相上下。在UNIX中大家都不叫做批次档
,而叫做Shell Script。</pre>

<pre>    一般而言,Shell Script的地位和其它的可执行档(或命令)是完全相同的,只不
过Shell Script是以文字档的方式储存,而非二进位档。而执行Shell Script时,必须
有一个程式将其内容转成一道道的命令执行,而这个程式其实就是Shell ,这也就是为
什麽我们叫做Shell Script的原因(往後我们称为Script)。不同Shell 的Script基本
上会有一些差异,所以我们不能将写给A shell 的Script用B shell 执行。而在UNIX中
大家最常使用Bourne Shell以及C Shell ,所以这堂课就介绍这两种Script的写法。
</pre>

<pre>□将文字档设为可执行的Shell Script</pre>

<pre>    如果我们已经写好Script,如何将其设成可执行档呢?因为Script其实是一个可执
行档,所以必须将其存取权设定成可执行。我们可以使用下列命令更改存取权:</pre>

<pre>        chmod u+x filename      只有自己可以执行,其它人不能执行
        chmod ug+x filename     只有自己以及同一群可以执行,其它人不能执行
        chmod +x filename       所有人都可以执行</pre>

<pre>    而我们如何指定使用那一个Shell 来解释所写的Script呢?几种基本的指定方式如
下所述:
1. 如果Script的第一个非空白字元不是&quot;#&quot;,则它会使用Bourne Shell。
2. 如果Script的第一个非空白字元是&quot;#&quot;时,但不以&quot;#!&quot;开头时,则它会使用C Shell。
3. 如果Script以&quot;#!&quot;开头,则&quot;#!&quot;後面所写的就是所使用的Shell,而且要将整个路径
    名称指出来。</pre>

<pre>    名称指出来。
这里建议使用第三种方式指定Shell ,以确保所执行的就是所要的。Bourne Shell的路
径名称为/bin/sh ,而C Shell 则为/bin/csh。</pre>

<pre>    &lt;eg&gt;
        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内指定所使用的Shell 外,你也可以在命令列中强制指定。比如你要
用C Shell 执行某个Script,你可以下这个命令:</pre>

<pre>        csh filename</pre>

<pre>此时的Script的存取权就不一定要为可执行档,其内部所指定的Shell 也会无效,详细
的情形後面会讨论。
</pre>

<pre>□Script的基本结构及观念</pre>

<pre>    Script是以行为单位,我们所写的Script会被分解成一行一行来执行。而每一行可
以是命令、注解、或是流程控制指令等。如果某一行尚未完成,可以在行末加上&quot;\&quot; ,
这个时候下一行的内容就会接到这一行的後面,成为同一行,如下
        ┌———————————┐
        │echo The message is \ │
        │too long so we have \ │
        │to split it into \    │
        │several lines         │
        └———————————┘
    当Script中出现&quot;#&quot; 时,再它後面的同一行文字即为注解,Shell 不会对其翻译。
    在Script中要执行一个命令的方法和在命令列中一样,你可以前景或背景执行,执
行命令时也会需要设定一些环境变数。
    Script的流程控制和一般高阶语言的流程控制没有什麽两样,也和高阶语言一样有
副程式。这些使得Script的功能更加强大。
    为了达到与高阶语言相同的效果,我们也可以在Script中设定变数,如此使Script
成为一个名付其实的高阶语言。
</pre>

<pre>□Bourne Shell</pre>

<pre>一、变数</pre>

<pre>    Bourne Shell的变数型态只有字串变数,所以要使用数值运算则必须靠外部命令达
    成目的。而其变数种类有下列几种:</pre>

<pre>    1. 使用者变数
        这是最常使用的变数,我们可以任何不包含空白字元的字串来当做变数名称。
        设定变数值时则用下列方式:</pre>

<pre>            var=string</pre>

<pre>        取用变数时则在变数名称前加上一&quot;$&quot; 号。</pre>

<pre>        &lt;eg&gt;
            ┌———————┐
            │name=Tom      │
            │echo name     │
            │echo $name    │
            └———————┘
            结果如下:
            name
            Tom</pre>

<pre>    2. 系统变数(环境变数)
        和使用者变数相似,只不过此种变数会将其值传给其所执行的命令。要将一使
        用者变数设定为系统变数,只要加上:</pre>

<pre>            export var</pre>

<pre>        &lt;eg&gt;
            ┌———————┐
            │name=Tom      │
            │export name   │
            └———————┘</pre>

<pre>        以下是使用者一进入系统之後就已设定好的系统变数:</pre>

<pre>            $HOME       使用者自己的目录
            $PATH       执行命令时所搜寻的目录
            $TZ         时区
            $MAILCHECK  每隔多少秒检查是否有新的信件
            $PS1        在命令列时的提示号
            $PS2        当命令尚未打完时,Shell 要求再输入时的提示号
            $MANPATH    man 指令的搜寻路径</pre>

<pre>    3. 唯读的使用者变数
        和使用者变数相似,只不过这些变数不能被改变。要将使用者变数设成唯读的
        ,只要加上:</pre>

<pre>            readonly var</pre>

<pre>        而若只打readonly则会列出所有唯读的变数。还有一点,系统变数不可以设定
        成唯读的。</pre>

<pre>        &lt;eg&gt;
            ┌———————┐
            │name=Tom      │
            │readonly name │
            │echo $name    │
            │name=John     │
            │readonly      │
            └———————┘
            结果如下:
            Tom
            name: is read only
            readonly name
            readonly ......</pre>

<pre>    4. 特殊变数
        有些变数是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它
        唯读的系统变数,而叫它特殊变数(有些书会叫它唯读的系统变数),因为这
        些变数是一执行程式时就有了,况且使用者无法将一般的系统变数设定成唯读
        的。以下是一些等殊变数:</pre>

<pre>            $0      这个程式的执行名字
            $n      这个程式的第n个参数值,n=1..9
            $*      这个程式的所有参数
            $#      这个程式的参数个数
            $$      这个程式的PID
            $!      执行上一个背景指令的PID
            $?      执行上一个指令的返回值</pre>

<pre>        当你执行这个程式时的参数数目超过9 个时,我们可以使用shift 命令将参数
        往前移一格,如此即可使用第10个以後的参数。除此之外,吾人可以用set 命
        令改变$n及$*,方法如下:</pre>

<pre>            set string</pre>

<pre>        如此$*的值即为string,而分解後则会放入$n。如果set 命令後面没有参数,
        则会列出所有已经设定的变数以及其值。</pre>

<pre>        &lt;eg&gt;
            档名:ex1  参数: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     │
            └———————————┘
            结果如下:
            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>    值得一提的是,当你想从键盘输入一变数值时,你可以使用下面的命令:</pre>

<pre>        read var1 var2.....</pre>

<pre>    这时read会将一个字分给一个变数。如果输入的字比变数还多,最後一个变数会将
    剩下的字当成其值。如果输入的字比变数还少,则後面的变数会设成空字串。
        如果需要处理数值运算,我们可以使用expr命令。其参数及输出列於附录A。
</pre>

<pre>二、执行命令</pre>

<pre>    在Bourne Shell中有五种方法执行一个命令,而这五种方式所产生的果有些许的不
    同。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -