tempad

Shell编程

ReadyGo!技术成就梦想 网络搜索 efish 2008-4-12 3:03:58
在DOS中,你可能会从事一些例行的重覆性工作,此时你会将这些重覆性的命令写成批次档,只要执行这个批次档就等於执行这些命令。大家会问在UNIX中是否有批次处理这个东东,答案是有的。在UNIX中不只有如DOS的批次处理,它的功能比起DOS更强大,相对地也较复杂,已经和一般的高阶语言不相上下。在UNIX中大家都不叫做批次档,而叫做ShellScript。

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

将文字档设为可执行的ShellScript

如果我们已经写好Script,如何将其设成可执行档呢?因为Script其实是一个可执行档,所以必须将其存取权设定成可执行。我们可以使用下列命令更改存取权:
chmodu xfilename只有自己可以执行,其它人不能执行
chmodug xfilename只有自己以及同一群可以执行,其它人不能执行
chmod xfilename所有人都可以执行

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

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


1.使用BourneShell
┌——————————┐┌——————————┐
│echoenterfilename││#!/bin/sh│
│.│or│.│
│.││.│
│.││.│
└——————————┘└——————————┘

2.使用CShell
┌——————————┐┌——————————┐
│#CShellScript││#!/bin/csh│
│.││.│
│.││.│
│.││.│
└——————————┘└——————————┘

3.使用/etc/perl
┌——————————┐
│#!/etc/perl│
│.│
│.│
│.│
└——————————┘

除了在Script内指定所使用的Shell外,你也可以在命令列中强制指定。比如你要用CShell执行某个Script,你可以下这个命令:
cshfilename

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

□Script的基本结构及观念

Script是以行为单位,我们所写的Script会被分解成一行一行来执行。而每一行可以是命令、注解、或是流程控制指令等。如果某一行尚未完成,可以在行末加上"\",这个时候下一行的内容就会接到这一行的後面,成为同一行,如下

┌———————————┐
│echoThemessageis\│
│toolongsowehave\│
│tosplititinto\│
│severallines│
└———————————┘

当Script中出现"#"时,再它後面的同一行文字即为注解,Shell不会对其翻译。

在Script中要执行一个命令的方法和在命令列中一样,你可以前景或背景执行,执行命令时也会需要设定一些环境变数。

Script的流程控制和一般高阶语言的流程控制没有什麽两样,也和高阶语言一样有副程式。这些使得Script的功能更加强大。

为了达到与高阶语言相同的效果,我们也可以在Script中设定变数,如此使Script成为一个名付其实的高阶语言。

□BourneShell

一、变数

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

1.使用者变数

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

取用变数时则在变数名称前加上一"$"号。


┌———————┐
│name=Tom│
│echoname│
│echo$name│
└———————┘
结果如下:
name
Tom

2.系统变数(环境变数)

和使用者变数相似,只不过此种变数会将其值传给其所执行的命令。要将一使用者变数设定为系统变数,只要加上:
exportvar

┌———————┐
│name=Tom│
│exportname│
└———————┘

以下是使用者一进入系统之後就已设定好的系统变数:
$HOME使用者自己的目录
$PATH执行命令时所搜寻的目录
$TZ时区
$MAILCHECK每隔多少秒检查是否有新的信件
$PS1在命令列时的提示号
$PS2当命令尚未打完时,Shell要求再输入时的提示号
$MANPATHman指令的搜寻路径

3.唯读的使用者变数

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

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

┌———————┐
│name=Tom│
│readonlyname│
│echo$name│
│name=John│
│readonly│
└———————┘

结果如下:
Tom
name:isreadonly
readonlyname
readonly......

4.特殊变数

有些变数是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它唯读的系统变数,而叫它特殊变数(有些书会叫它唯读的系统变数),因为这些变数是一执行程式时就有了,况且使用者无法将一般的系统变数设定成唯读的。以下是一些等殊变数:
$0这个程式的执行名字
$n这个程式的第n个参数值,n=1..9
$*这个程式的所有参数
$#这个程式的参数个数
$$这个程式的PID
$!执行上一个背景指令的PID
$?执行上一个指令的返回值

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

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

档名:ex1参数:thisisatest

┌———————————┐
│echoFilename:$0│
│echoArguments:$*│
│echoNo.ofargs.:$#│
│echo2ndarg.:$2│
│shift│
│echoNo.ofargs.:$#│
│echo2ndarg.:$2│
│sethello,everyone│
│echoArguments:$*│
│echo2ndarg.:$2│
└———————————┘
结果如下:
Filename:ex1
Arguments:thisisatest
No.ofargs

   

[1]  [2]  上一页  下一页
责任编辑: efish 参与评论 查找更多:
相关文章
设置Unix启动admin888 设置Unix启动admin888
shell实现Unix进程间信息交换的几种方法 shell实现Unix进程间信息交换的几种方法
Shell递归程序设计-批量转换大写文件名为小写 Shell递归程序设计-批量转换大写文件名为小写
shell编程例子--一个简单的目录菜单 shell编程例子--一个简单的目录菜单
shell编程例子--一个.login例子 shell编程例子--一个.login例子
Bash中的变量 Bash中的变量
Bash中对变量的操作 Bash中对变量的操作
Bash中的特殊字符 Bash中的特殊字符
赶走一些你不希望进入的用户 赶走一些你不希望进入的用户
也谈在Unix系统中杀死相关终端的进程 也谈在Unix系统中杀死相关终端的进程
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想