首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | linux相关 | linux认证 | 下载中心 | 专题
oklinux
 系统管理:中文环境 系统管理 桌面应用 内核技术 Linux基础:安装配置 常用命令 经验技巧 软件应用 Linux数据库:Mysql POSTGRE
 网络管理:网络安全 网络应用 Linux服务器 编程开发:PHP CC++ Python Perl SHELL 嵌入式开发 | PHP基础 PHP技巧 PHP应用 PHP文摘
 首页 linux资讯动态 Linux专题 | 其他Unix Linux解决方案 硬件相关 Linux认证 企业应用 Apache | 相关下载:软路由 参考手册 开发工具
 → 当前位置:首页>编程开发>shell>正文

Shell编程

OKLinux www.oklinux.cn 2007-01-28 来源:         会员收藏 游客收藏

 在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 只有自己以及同一群可以执行,其它人不能执行 
chmod +x filename 所有人都可以执行 

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

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


1. 使用Bourne Shell
┌——————————┐ ┌——————————┐
│echo enter filename │ │#!/bin/sh │
│ . │ or │ . │
│ . │ │ . │
│ . │ │ . │
└——————————┘ └——————————┘

2. 使用C Shell
┌——————————┐ ┌——————————┐
│# C Shell Script │ │#!/bin/csh │
│ . │ │ . │
│ . │ │ . │
│ . │ │ . │
└——————————┘ └——————————┘

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

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

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

□Script的基本结构及观念 

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

┌———————————┐
│echo The message is \ │
│too long so we have \ │
│to split it into \ │
│several lines │
└———————————┘

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

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

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

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

□Bourne Shell 

一、变数 

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

1. 使用者变数 

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

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


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

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

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

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

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

3. 唯读的使用者变数 

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

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

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

结果如下:
Tom
name: is read only
readonly name
readonly ......

4. 特殊变数 

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

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

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

档名:ex1 参数:this is a test 

┌———————————┐
│echo Filename: $0 │
│echo Arguments: $* │
│echo No. of args.: $# │
│echo 2nd arg.: $2 │
│shift │
│echo No. of args.: $# │
共3页: 上一页 1 [2] [3] 下一页
上一篇: shell编程例子 -- 一个简单的目录菜单   下一篇: 从 ifconfig 中得到 IP地址
收藏于收藏夹】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
· shell编程例子 -- 一个简单的目录菜单
· 从 ifconfig 中得到 IP地址
· Shell 递归程序设计-目录列表
· 批量添加用户
· shell技巧
· Linux程式设计-11.Shell Script(bash)--(1
· 快速编辑 Shell 命令行
· Linux程式设计-11.Shell Script(bash)--(1
· 一个小脚本,帮助你清除无用的rpm包
· Linux程式设计-11.Shell Script(bash)--(1
发表评论
密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。)
站内搜索
阅读排行榜
·shell编程实例三:一个简
·常用Linux Shell技巧集锦
·Shell编程基础
·Shell 编程实例集锦
·shell编程实例一:login例
·shell入门基础必备
·Linux系统环境下的Socket
·走进嵌入式Linux的世界
·Linux主要shell命令详解
·玩转Linux shell命令提示
最新文章
· 用shell写守护进程
· Sobell谈bash和Linux命令
· Linux shell介绍,第四章
· Linux shell介绍,第三章
· Linux Shell介绍,第二章
· Linux Shell介绍,第一章
· bash字符串匹配的用法
· Bash For Beginner's Gui
· shell是什么
· 新手看招 Linux Shell编
· shell技巧
· Shell编程新手入门 Linux
· 在Linux系统中批量建立用
· Linux中让Tomcat5自动启
· TCSH shell 编程入门

设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2007 All rights reserved OKLinux.Cn 版权所有
合作联系 QQ:18743986 Email:arlan8005#163.com