基本语句
从本节起,我们将周详介绍Shell程式设计的基本知识,通过编写Shell脚本,用户能够根据自己的需要有条件的或重复的执行命令。通过Shell程式,能够把单个的UNIX命令组合成一个完全实用的工具,完成用户的任务。
1>什么是Shell程式
当用户在UNIX Shell中输入了一条复杂的命令,如:
$ls -R /|greo myname |pg
我们能够称用户在对Shell编程,当把这条语句写在一个文档里,并且符给该文档可执行权限,那么该文档就是我们传统上说的Shell程式。
2>简单的Shell程式
假设用户每天使用下述命令备份自己的数据文档:
$cd /usr/icewalk;ls * |cpio -o > /dev/fd0
我们能够把他写在一个文档,如:ba.sh中:
$cat >ba.sh
cd /usr/icewalk
ls * |cpio -o > /dev/fd0
^D (ctrl_d)
程式ba.sh就是Shell脚本,用户能够用vi或其他编辑工具编写更复杂的脚本。
此时用户备份文档只需要执行Shell程式ba.sh,执行时需在当前Shell中创建一个子Shell:
$sh ba.sh
程式sh和用户登陆时执行的Bourne Shell相同,但当Sh命令带参数ba.sh后,他将不再是个交互式的Shell,而是直接从文档ba.sh中读取命令。
执行ba.sh中命令的另一方法是给文档ba.sh执行权限:
$chmod x ba.sh
此时,用户能够输入文档名ba.sh做为一个命令来备份自己的数据,需要注意的是,用这种方法执行命令的时候,文档ba.sh必须存在于环境变量$PATH所指定的路径上。
Unix系列shell程式编写(中)
3>在Shell中使用数据变量
用户能够在Shell中使用数据变量,例如ba.sh程式:
cd/usr/icewalk
ls|cpio -o > /dev/fd0
该程式中要备份的目录为一常量,即该程式只能用来备份一个目录。若在该程式中使用变量,则会使其更通用:
workdir=$1
cd $workdir
ls * |cpio -o > /dev/fd0
通过这一改变,用户能够使用程式备份变量$workdir指定的目录。例如我们要备份/home/www的内容,只要运行ba.sh /home/www即可实现。(若不明白 $1,下面将周详介绍shell参数的传递,$1代表本sh程式-ba.sh的第一个参数)
4>在Shell程式中加上注释
为了增加程式的可读性,我们提倡加入注释。在Shell程式中注释将以"#"号开始。当Shell解释到"#"时,会认为从"#"号起一直到该行行尾为注释。
5>对Shell变量进行算术运算
高级语言中变量是具备类型的,即变量将被限制为某一数据类型,如整数或字符类型。Shell变量通常按字符进行存储,为了对Shell变量进行算术运算,必须使用expr命令。
expr命令将把一个算术表达式作为参数,通常形式如下:
expr [数字] [操作符] [数字]
由于Shell是按字符形式存储变量的,所以用户必须确保参加算术运算的操作数必须为数值。下面是有效的算术操作符:
两个整数相加
- 第一个数减去第二个数
* 两整数相乘
/ 第一个整数除以第二个整数
% 两整数相除,取余数
例如:
$expr 2 1
结果显示:3
$expr 5 - 3
结果显示:2
若expr的一个参数是变量,那么在表达式计算之前用变量值替换变量名。
$int=3
$expr $int 4
结果显示:7
用户不能单纯使用"*"做乘法,若输入:
$expr 4*5
系统将会报错,因为Shell看到"*"将会首先进行文档名替换。正确形式为:
$expr 4 \* 5
结果显示:20
多个算术表达式能够组合在一起,例如:
$expr 5 7 / 3
结果显示:7
运算次序是先乘除后加减,若要改变运算次序,必须使用"`"号,如:
$int=`expr 5 7`
$expr $int/3
结果显示:4
或:
$expr `expr 5 7`/3
结果显示:4
6>向Shell程式传递参数
一个程式能够使用两种方法获得输入数据。一是执行时使用参数。另一种方法是交互式地获得数据。vi编辑程式能够通过交互式的方法获得数据,而ls和expr则从参数中取得数据。以上两种方法Shell程式都能够使用。在"交互式读入数据"一节中将介绍Shell程式通过交互式的方法获得参数。
通过命令行给Shell程式传递参数能够扩大程式的用途。以前面提到的ba.sh程式为例:
$cat >re.sh
cd $workdir
cpio -i < /dev/fd0
^d
程式re.sh恢复了ba.sh程式备份的任何文档。若只从软盘上恢复一个指定的文档,能够用该文档名作为参数,传递给Shell程式re.sh:
程式改写如下:
$cat >re2.sh
cd $workdir
cpio -i $1 < /dev/fd0
^d
用户能够指定要恢复的文档,例如fname
$re2.sh fname
此时文档fname作为第一个位置参数传递给re2.sh,re2.sh的缺点是要恢复两个或多个文档要重复运行,我们能够用$*变量传递不确定的参数给程式:
$cat >re3.sh
cd $workdir
cpio -i $* < /dev/fd0
^d
我们就能够恢复多个文档,例如fname1,fname2,fname3
$re3.sh fname1 fname2 fname3
(以上程式re.sh,re2.sh,re3.sh,假设用户已chmod了可执行权利)
因为没有赋值的变量能够作为NULL看待,所以若是程式re3.sh在执行时候没赋予参数,那么一个空值将被插入到cpio命令中。该命令将恢复任何保存的文档。
条件判断语句
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



