UNIX SHELL脚本编程


<<<目录>>>
□前言
□将文字档设为可执行的Shell Script□Script的基本结构及观念□Bourne Shell一、变数二、执行命令三、流程控制□C Shell一、变数二、执行命令三、流程控制□附录A expr命令□附录B test命令□前言在Dos 中,你可能会从事一些例行的重覆性工作,此时你会将这些重覆性的命令写 成批次档,只要执行这个批次档就等於执行这些命令 。大家会问在Unix中是否有批次处 理这个东东,答案是有的 。在UNIX中不只有如DOS 的批次处理,它的功能比起DOS 更强 大,相对地也较复杂,已经和一般的高阶语言不相上下 。在UNIX中大家都不叫做批次档,而叫做Shell Script 。一般而言,Shell Script的地位和其它的可执行档(或命令)是完全相同的,只不 过Shell Script是以文字档的方式储存,而非二进位档 。而执行Shell Script时,必须 有一个程式将其内容转成一道道的命令执行,而这个程式其实就是Shell,这也就是为 什麽我们叫做Shell Script的原因(往後我们称为Script) 。不同Shell 的Script基本 上会有一些差异,所以我们不能将写给A shell 的Script用B shell 执行 。而在UNIX中 大家最常使用Bourne Shell以及C Shell,所以这堂课就介绍这两种Script的写法 。□将文字档设为可执行的Shell Script如果我们已经写好Script,如何将其设成可执行档呢?因为Script其实是一个可执 行档,所以必须将其存取权设定成可执行 。我们可以使用下列命令更改存取权:chmod u x filename 只有自己可以执行,其它人不能执行chmod ug x filename 只有自己以及同一群可以执行,其它人不能执行chmodx filename 所有人都可以执行而我们如何指定使用那一个Shell 来解释所写的Script呢?几种基本的指定方式如 下所述:1. 如果Script的第一个非空白字元不是"#",则它会使用Bourne Shell 。2. 如果Script的第一个非空白字元是"#"时,但不以"#!"开头时,则它会使用C Shell 。3. 如果Script以"#!"开头,则"#!"後面所写的就是所使用的Shell,而且要将整个路径 名称指出来 。这里建议使用第三种方式指定Shell,以确保所执行的就是所要的 。Bourne Shell的路 径名称为/bin/sh,而C Shell 则为/bin/csh 。除了在Script内指定所使用的Shell 外,你也可以在命令列中强制指定 。比如你要 用C Shell 执行某个Script,你可以下这个命令:csh filename此时的Script的存取权就不一定要为可执行档,其内部所指定的Shell 也会无效,详细 的情形後面会讨论 。□Script的基本结构及观念 Script是以行为单位,我们所写的Script会被分解成一行一行来执行 。而每一行可 以是命令、注解、或是流程控制指令等 。如果某一行尚未完成,可以在行末加上"",这个时候下一行的内容就会接到这一行的後面,成为同一行,如下echo the message istoo long so we haveto split it intoseveral lines.当Script中出现"#" 时,再它後面的同一行文字即为注解,Shell 不会对其翻译 。在Script中要执行一个命令的方法和在命令列中一样,你可以前景或背景执行,执 行命令时也会需要设定一些环境变数 。Script的流程控制和一般高阶语言的流程控制没有什麽两样,也和高阶语言一样有 副程式 。这些使得Script的功能更加强大 。为了达到与高阶语言相同的效果,我们也可以在Script中设定变数,如此使Script 成为一个名付其实的高阶语言 。□Bourne Shell一、变数Bourne Shell的变数型态只有字串变数,所以要使用数值运算则必须靠外部命令达 成目的 。而其变数种类有下列几种:1. 使用者变数 这是最常使用的变数,我们可以任何不包含空白字元的字串来当做变数名称 。设定变数值时则用下列方式:var=string 取用变数时则在变数名称前加上一"$" 号 。name=Tomecho nameecho $name结果如下:nameTom2. 系统变数(环境变数)和使用者变数相似,只不过此种变数会将其值传给其所执行的命令 。要将一使 用者变数设定为系统变数,只要加上:export varname=Tomexport name以下是使用者一进入系统之後就已设定好的系统变数:$HOME 使用者自己的目录$PATH 执行命令时所搜寻的目录$TZ 时区$MAILCHECK 每隔多少秒检查是否有新的信件$PS1 在命令列时的提示号$PS2 当命令尚未打完时,Shell 要求再输入时的提示号$MANPATH man 指令的搜寻路径3. 唯读的使用者变数和使用者变数相似,只不过这些变数不能被改变 。要将使用者变数设成唯读的,只要加上:readonly var 而若只打readonly则会列出所有唯读的变数.还有一点,系统变数不可以设定 成唯读的 。name=Tomreadonly nameecho $name

推荐阅读