关于shell的编程祥解.doc

上传人:asd****56 文档编号:70344677 上传时间:2023-01-19 格式:DOC 页数:27 大小:114KB
返回 下载 相关 举报
关于shell的编程祥解.doc_第1页
第1页 / 共27页
关于shell的编程祥解.doc_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《关于shell的编程祥解.doc》由会员分享,可在线阅读,更多相关《关于shell的编程祥解.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、关于shell的编程祥解,望版主加入精品内。作者:yurenyahe 发表时间:2002/12/31 09:36am*Shell是什么?任何发明都具有供用户使用的界面。UNIX供用户使用的界面就是Shell(DOS的command熟悉吧,但UNIX的要强大的多)。 Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。为了不同的需要,UNIX提供了不同的Shell。现在的UNIX大部分都支持BourneShell,以下教程就以BourneShell(Bsh)为例,一步步的领略UNIX Shell的强大功能,占先其强大魅力,达到更方便灵活的管理、应用UNIX的目的。1.UNIX内核和S

2、hell的交互方法启动UNIX时,程序UNIX(内核)将被调入计算机内存,并一直保留在内存中直到机器关闭。在引导过程中,程序 init将进入后台运行一直到机器关闭。该程序查询文件/etc/inittab,该文件列出了连接终端的各个端口及其特征。当发现一个活动的终端时, init程序调用getty程序在终端上显示login等登陆信息。(username和passwd),在输入密码后, getty调用login进程,该进程根据文件/etc/passwd的内容来验证用户的身份。若用户通过身份验证,login进程把用户的home目录设置成当前目录并把控制交给一系列setup程序。setup程序可以是指

3、定的应用程序,通常setup程序为一个Shell程序,如:/bin/sh 即Bourne Shell(command出来了,呵呵)。得到控制后,Shell程序读取并执行文件/etc/.profile以及.profile。这两个文件分别建立了系统范围内的和该用户自己的工作环境。最后Shell显示命令提示符,如$。(这是以bsh为例,若是csh,为.cshrc,ksh为.kshrc,bash为. bashrc等等) 注:(不妨把/etc/.profile和.profile看成DOS的autoexec.bat 或 config.sys文件)当shell退出时,内核把控制交给init程序,该程序重新启

4、动自动登陆过程。有两种方法使shell退出,一是用户执行exit命令,二是内核(例如root用kill命令)发出一个kill命令结束shell进程。shell退出后,内核回收用户及程序使用的资源。用户登陆后,用户命令同计算机交互的关系为:命令进程-Shell程序-UNIX内核-计算机硬件。当用户输入一个命令,如$ls, Shell将定位其可执行文件/bin/ls并把其传递给内核执行。内核产生一个新的子进程调用并执行/bin/ls。当程序执行完毕后,内核取消该子进程并把控制交给其父进程,即Shell程序。例如执行:$ps该命令将会列出用户正在执行的进程,即Shell程序(下来详细说说,别急现在)

5、和ps程序。若执行:$sleep 10 &$ps其中第一条命令将产生一个在后台执行的sleep子进程。ps命令执行时会显示出该子进程。每当用户执行一条命令时,就会产生一个子进程。该子进程的执行与其父进程或Shell完全无关,这样可以使Shell去做其他工作。(Shell只是把用户的意图告诉内核,然后该干嘛干嘛:) 现在windows有个计划任务(在固定的时间,日期自动执行某任务),其实UNIX很早就有这个功能了,也就是所谓的Shell的自动执行。一些 UNIX 资源,如cron可以自动执行Shell程序而无需用户的参与,(这个功能好象在/var/spool/crotab目录里)。 Cronta

6、b 程序对于系统管理员来说是非常有用的。Cron 服务用于计划程序在特定时间(月、日、周、时、分)运行。我们以root的crontab 为例。根用户的 crontab 文件放在 /var/spool/crontab/root 中,其格式如下:(1) (2) (3) (4) (5) (6) 0 0 * * 3 /usr/bin/updatedb1. 分钟 (0-60)2. 小时 (0-23)3. 日 (1-31)4. 月 (1-12)5. 星期 (1-7)6. 所要运行的程序2.Shell的功能和特点1命令行解释2使用保留字3使用Shell元字符(通配符)4可处理程序命令5使用输入输出重定向和管

7、道6维护一些变量7运行环境控制8支持Shell编程对于命令行解释就不多说了,就是在shell提示符(例如:$,%,#等)后输入一行unix命令,Shell将接收用户的输入。使用保留字:Shell有一些具有特殊意义的字,例如在Shell脚本中,do,done,for等字用来控制循环操作,if,then等控制条件操作。 保留字随Shell环境的不同而不同。通配符:* 匹配任何位置? 匹配单个字符 匹配的字符范围或列表 例如: $ls a-c* 将列出以a-c范围内字符开头的所有文件 $ls a,m,t*将列出以e,m或t开头的所有文件程序命令 :当用户输入命令后,Shell读取环境变量$path(

8、一般在用户自己的.profile中设置),该变量包含了命令可执行文件可能存在的目录列表。 shell从这些目录中寻找命令所对应的可执行文件,然后将该文件送给内核执行。输入输出重定向及管道 :重定向的功能同DOS的重定向功能: 重定向输出 当login程序激活用户shell后,将为用户建立环境变量。从/etc/profile和.profile文件中读出,在这些文件中一般都用$TERM 变量设置终端类型,用$PATH变量设置Shell寻找可执行文件的路径。2从/etc/passwd文件或命令行启动shell时,用户可以给shell程序指定一些参数,例如-x,可以在命令执行前显示该命令及其参数。后面

9、详细介绍这些参数。shell编程 :本文主要介绍的内容。shell本身也是一种语言(*可以先理解为unix命令的组合,加上类C的条件,循环等程序控制语句,类似dos批处理,但要强大的多),用户可以 通过shell编程(脚本,文本文件),完成特定的工作。SHELL变量下面我们详细的介绍Bourne Shell的编程:自从贝尔实验室设计了Bourne Shell。从那时起许多厂商根据不同的硬件平台设计了许多版本得unix。但在众多版本的unix中,Bourne Shell 一直保持一致。1Bsh的启动:用户在登陆后,系统根据文件/etc/passwd中有关该用户的信息项启动Shell。例如某用户在

10、passwd中 的信息项为:ice_walk:!:411:103:Imsnow ,ice_walk:/home/ice_walk:/bin/bsh则表明,用户名是ice_walk等信息,在最后一项/bin/bsh表明用户的sh环境类型是bsh,于是系统启动之。在启动或执行(包括下面我们要讲 的shell程序-脚本)过程中可以使用以下一些参数,我们一一说明:-a 将所有变量输出-c string从string中读取命令-e 使用非交互式模式-f 禁止shell文件名产生-h 定义-i 交互式模式-k 为命令的执行设置选项-n 读取命令但不执行-r 受限模式-s 命令从标准输入读取-t 执行一命令

11、,然后退出shell-u 在替换时,使用未设置的变量将会出错-v 显示shell的输入行-x 跟踪模式,显示执行的命令许多模式可以组合起来用,您可以试试了,但-ei好象不行,你说why呢?使用set可以设置或取消shell的选项来改变shell环境。打开选项用-,关闭选项用+,多数unix允许打开或关闭a、f、e、h、k、n、 u、v和x选项。若显示Shell中已经设置的选项,执行:$echo $-Bsh中每个用户的home目录下都有一个.profile文件,可以修改该文件来修改shell环境。为了增加一个可执行文件的路径(例如/ice_walk/bin), 可以把下面代码加入.profile

12、中PATH=$PATH:/ice_walk/bin;exprot PATH .profile中shell的环境变量意思如下:CDPATH 执行cd命令时使用的搜索路径HOME 用户的home目录IFS 内部的域分割符,一般为空格符、制表符、或换行符MAIL 指定特定文件(信箱)的路径,有UNIX邮件系统使用PATH 寻找命令的搜索路径(同dos的config.sys的 path)PS1 主命令提示符,默认是$PS2 从命令提示符,默认是TERM 使用终端类型2Bsh里特殊字符及其含义在Bsh中有一组非字母字符。这些字符的用途分为四类:作为特殊变量名、产生文件名、数据或程序控制以及引用和逃逸字符

13、控制。他们 可以让用户在Shell中使用最少的代码完成复杂的任务。* Shell变量名使用的特殊字符$# 传送给命令Shell的参数序号$- 在Shell启动或使用set命令时提供选项$? 上一条命令执行后返回的值$ 当前shell的进程号$! 上一个子进程的进程号$ 所有的参数,每个都用双括号括起$* 所有参数,用双括号括起$n 位置参数值,n表示位置$0 当前shell名*产生文件名的特殊字符包括*,?,,上面讲过,不再多说。*数据或程序控制使用的特殊字符(file) 输出重定向到文件中(没有文件则创建,有则覆盖)(file) 输出重定向到文件中(没有则创建,有则追加到文件尾部)对于引用或

14、逃逸的特殊字符Bsh用单引号 和双引号 将特殊字符或由空白分隔的字引用起来组成一个简单的数据串.使用单引号和双引号的区别是双引号中的内容可进行参数和变量替换.逃逸字符也一样.$echo $HOME $PATH 结果显示$/u/ice_walk/bin:/etc:/usr/bin而$echo $HOME $PATH 结果显示$HOME $PATHshell的逃逸符是一个,表示其后的字符不具有特殊的含义或不是shell的函数$echo $HOME $PATH结果显$HOME /bin:/etc:/usr/bin:3Bsh的变量前面我们在多个地方引用了变量,当Shell遇到一个$符时(没有被引用或逃

15、逸),它将认为其后为一变量。不论该变量是环境变量还是用户自定义的变量,在命令行中变量名要被变量值替换。例如命令:ls $HOME将列出变量HOME对应目录下的文件。用户可以在命令行中的任何地方进行变量替换。包括命令名本身,例如:$dir=ls$dir f*将列出以f开头的文件。现在详细的介绍下Bsh的变量。Bsh中有四类变量:用户定义的变量、位置变量(shell参数)、预定义变量及环境变量。用户定义的变量:用户定义的变量由字母和下划线组成,并且变量名的第一个字符不能为数字(09)。与其他UNIX名字一样,变量名是大小写敏感的。用户可以在命令行上用=给变量赋值,例如:$NAME=ice_walk

16、给变量NAME赋值为ice_walk,在应用变量NAME的时候,在NAME前加$即可,前面已说,不再废话(别说我废话多,关键是没当过老师:()。可以用变量和其他字符组成新的字,例如:$SUN=sun$echo $SUNday在应用shell变量时候,可以在变量名字两边$后面加上,以更加清楚的显示给shell,哪个是真正的变量,以实现字符串的合并等功能。结果显示:sunday(注意不能echo $SUNday,因为SUNday变量没定义,读者试下执行结果) 用户也可以在命令行上同时对多个变量赋值,赋值语句之间用空格分开:$X=x Y=y注意变量赋值是从右到左进行的$X=$Y Y=yX的值是y$X

17、=z Y=$ZY的值是空(变量未赋值时,shell不报错,而是赋值为空)用户可以使用unset 命令清除给变量赋的值用户使用变量时要在其前面加一$符,使变量名被变量值所替换。Bsh可以进行变量的条件替换,即只有某种条件发生时才进行替换。替换条件放在一对大括号中,如:$variable: -value variable是一变量值,value是变量替换使用的默认值$echo Hello $UNAME结果显示:Hello$echo Hello $UNAME: -there结果显示:Hello there$echo $UNAME结果显示: (空)$UNAME=John$echo Hello $UNAM

18、E: -there结果显示:Hello John可以看出,变量替换时将使用命令行中定义的默认值,但变量的值并没有因此而改变。另外一种替换的方法是不但使用默认值进行替换,而且将默认值赋给该变量。其形式如下:$variable:=value该形式在变量替换后同时把值value符给变量variable。$echo Hello $UNAME结果显示:Hello$echo Hello $UNAME:=there结果显示:Hello there$echo $UNAME结果显示:there$UNAME=John$echo Hello $UNAME:-there结果显示:Hello John变量替换的值也可以

19、是 括起来的命令:$USERDIR=$Mydir: -pwd第三种变量的替换方法是只有当变量已赋值时才用指定值替换形式:$variable: +value只有变量variable已赋值时,其值才用value替换,否则不进行任何替换,例如:$ERROPT=A$echo $ERROPT: +Error tracking is acitive结果显示:Error tracking is acitive$ERROPT=$echo $ERROPT: +Error tracking is acitive结果显示: (空)我们还可以使用错误检查的条件进行变量替换:$variable:?message当变量v

20、ariable已设置时,正常替换。否则消息message将送到标准错误输出(若此替换出现在shell程序中,那么该程序将终止)。例如:$UNAME=$echo $ UNAME:?UNAME HAS NOT BEEN SET结果显示:UNAME HAS NOT BEEN SET$UNAME=Stephanie$echo $ UNAME:?UNAME HAS NOT BEEN SET结果显示:Stephanie当没有指定message时,shell将显示一条默认的消息,例如:$UNAME=$echo $ UNAME:?结果显示:sh:UNAME:parameter null or not set4

21、位置变量或Shell参数在shell解释用户的命令时,将把命令行的第一个字作为命令,而其他的字作为参数。当命令对应的可执行文件为Shell程序时,这些参数将作为位置变量传送给该程序。第一个参数记为$1,第二个为$2.第九个为$9。其中1到9是真正的参数名,$符只是用来标识变量的替换。位置变量$0指命令对应的可执行文件名。在后面将详细介绍位置变量。1.只读变量用户将变量赋值后,为了防止以后对该变量的修改,可以用以下命令将该变量设置为只读变量:readonly variable2.export命令shell执行一个程序时,首先为该程序建立一个新的执行环境,称为子shell。在Bourne Shel

22、l中变量都是局部的,即他们只在创建他们的Shell中有意义。用户可以用export命令让变量被其他子Shell识别。但某用户的变量是没法让其他用户使用的。当用户启动一个新shell时,该shell将使用默认的提示符。因为赋给变量PS1的值只在当前shell中有效。为了让子Shell使用当前Shell中定义的提示符号,可以使用export命令:$PS1=Enter command:Enter command:export PS1Enter command:shEnter command:此时变量PS1变成了全局变量。它可以被其子Shell使用。当变量被设置成全局的以后,将一直保持有效直到用户退出

23、该变量所在的Shell。用户可以在文件.profile中给一个变量永久赋值。详见规范Shell。基本语句从本节起,我们将详细介绍Shell程序设计的基本知识,通过编写Shell脚本,用户可以根据自己的需要有条件的或者重复的执行命令。通过Shell程序,可以把单个的UNIX命令组合成一个完全实用的工具,完成用户的任务。1什么是Shell程序当用户在UNIX Shell中输入了一条复杂的命令,如:$ls -R /|greo myname |pg我们可以称用户在对Shell编程,当把这条语句写在一个文件里,并且符给该文件可执行权限,那么该文件就是我们传统上说的Shell程序。2简单的Shell程序假

24、设用户每天使用下述命令备份自己的数据文件:$cd /usr/icewalk;ls * |cpio -o /dev/fd0我们可以把它写在一个文件,如:ba.sh中:$cat ba.shcd /usr/icewalkls * |cpio -o /dev/fd0D (ctrl_d)程序ba.sh就是Shell脚本,用户可以用vi或其他编辑工具编写更复杂的脚本。此时用户备份文件只需要执行Shell程序ba.sh,执行时需在当前Shell中创建一个子Shell:$sh ba.sh程序sh与用户登陆时执行的Bourne Shell相同,但当Sh命令带参数ba.sh后,它将不再是一个交互式的Shell,而

25、是直接从文件ba.sh中读取命令。执行ba.sh中命令的另一方法是给文件ba.sh执行权限:$chmod +x ba.sh此时,用户可以输入文件名ba.sh做为一个命令来备份自己的数据,需要注意的是,用这种方法执行命令的时候,文件ba.sh必须存在于环境变量$PATH所指定的路径上。3在Shell中使用数据变量用户可以在Shell中使用数据变量,例如ba.sh程序:cd/usr/icewalkls|cpio -o /dev/fd0该程序中要备份的目录为一常量,即该程序只能用来备份一个目录。若在该程序中使用变量,则会使其更通用:workdir=$1cd $workdirls * |cpio -o

26、 /dev/fd0通过这一改变,用户可以使用程序备份变量$workdir指定的目录。例如我们要备份/home/www的内容,只要运行ba.sh /home/www即可实现。(若不明白 $1,下面将详细介绍shell参数的传递,$1代表本sh程序-ba.sh的第一个参数)4在Shell程序中加上注释为了增加程序的可读性,我们提倡加入注释。在Shell程序中注释将以#号开始。当Shell解释到#时,会认为从#号起一直到该行行尾为注释。5对Shell变量进行算术运算高级语言中变量是具有类型的,即变量将被限制为某一数据类型,如整数或字符类型。Shell变量通常按字符进行存储,为了对Shell变量进行算

27、术运算,必须使用expr命令。expr命令将把一个算术表达式作为参数,通常形式如下:expr 数字 操作符 数字由于Shell是按字符形式存储变量的,所以用户必须保证参加算术运算的操作数必须为数值。下面是有效的算术操作符:+两个整数相加-第一个数减去第二个数*两整数相乘/第一个整数除以第二个整数%两整数相除,取余数例如:$expr 2 + 1 结果显示:3$expr 5 - 3 结果显示:2若expr的一个参数是变量,那么在表达式计算之前用变量值替换变量名。$int=3$expr $int + 4结果显示:7用户不能单纯使用*做乘法,若输入:$expr 4*5系统将会报错,因为Shell看到*

28、将会首先进行文件名替换。正确形式为:$expr 4 * 5 结果显示:20多个算术表达式可以组合在一起,例如:$expr 5 + 7 / 3结果显示:7运算次序是先乘除后加减,若要改变运算次序,必须使用号,如:$int=expr 5 + 7$expr $int/3 结果显示:4或者:$expr expr 5+7/3结果显示:46向Shell程序传递参数一个程序可以使用两种方法获得输入数据。一是执行时使用参数。另一种方法是交互式地获得数据。vi编辑程序可以通过交互式的方法获得数据,而ls和 expr则从参数中取得数据。以上两种方法Shell程序都可以使用。在交互式读入数据一节中将介绍Shell程

29、序通过交互式的方法获得参数。通过命令行给Shell程序传递参数可以扩大程序的用途。以前面提到的ba.sh程序为例:$cat re.shcd $workdircpio -i re2.shcd $workdircpio -i $1 re3.shcd $workdircpio -i $* if - then语句格式: if command1thencommand2command3fi-(if 语句结束)command4每个程序或命令执行结束后都有一个返回的状态,用户可以用Shell变量$?获得这一状态。if语句检查前面命令执行的返回状态,若该命令成功执行,那么在then和fi之间的命令都将被执行。在

30、上面的命令序列中,command1和command4总要执行。若command1成功执行, command2和command3也将执行。请看下面程序:#unload -program to backup and remove filescd $1ls -a | cpio -o /dev/mnt0rm *该程序在备份资料后,删除档案,但当cpio命令不能成功执行时,rm命令还是把资料删除了,我们可不希望这样,为了避免此情况,可以用if - then语句:#-卸载和判断删除程序cd $1if ls -a | cpio /dev/mnt0thenrm *fi上面程序在cpio执行成功后才删除档案同时

31、,若执行没有成功,我们希望得到提示,sh中的echo命令可以向用户显示消息,并显示后换行,上面程序可以写成: #-卸载和判断删除程序cd $1if ls -a | cpio /dev/mnt0thenecho 正删除文件资料. .rm *fiecho命令可以使用一些特殊的逃逸字符进行格式化输出,下面是这些字符及其含义:bBackspacec显示后不换行f在终端上屏幕的开始处显示n换行r回车t制表符v垂直制表符 反斜框0nnn 用1,2或3位8进制整数表示一个ASCII码字符2if - then - else语句不用多说它的作用,别的高级语言中都有,格式为:if command1thencomm

32、and2command3elsecommand4command5fi在此结构中,command1中是先执行,当command1成功执行时,将执行command2和command3,否则执行command4和command5注意看下面程序:#备份程序cd $1if ls -a |cpio -o /dev/mnt0thenecho 删除源资料. .rm *elseecho 磁带备份失败!fi3test命令进行条件测试if语句可以通过测试命令执行的返回状态来控制命令的执行,若要测试其他条件,在bsh中可以使用test命令。该命令检测某一条件,当条件为真时返回 0,否则返回非0值。test命令可以使S

33、hell程序中的if语句象其他程序语言中的条件判断语句一样,具有很强的功能。test命令的使用方法为:test condition可测试的条件分为4类:1)测试两个字符串之间的关系。2)测试两个整数之间关系。3)测试文件是否存在或是否具有某种状态或属性。4)测试多个条件的与(and)或(or)组合。1、条件语句test语句1测试字符串间的关系bsh把所有的命令行和变量都看作字符串。一些命令如expr和test可以把字符当作数字进行操作。同样任何数字也可以作为字符串进行操作。用户可以比较两个字符串相等或不等,也可以测试一个串是否赋了值。有关串的操作符如下:str1 = str2当两个串有相同内容

34、、长度时为真str1 != str2 当串str1和str2不等时为真-n str1 当串的长度大于0时为真(串非空)-z str1 当串的长度为0时为真(空串)str1 当串str1为非空时为真不但Shell程序可以使用test进行条件判断,test命令也可以独立执行,如:$str1=abcd$test $str1 = abcd$echo $?结果显示:0与上例中第一行赋值语句中的等号不同,test命令中的等号两边必须要有空格。本例test命令共有3个参数。注意两个串相等必须是长度和内容都相等。$str1=abcd $test $str1 = abcd$echo $?结果显示:1上面str1

35、包含5个字符,其中最后一个为空格符。而test命令中的另一个串只有4个字符,所以两串不等,test返回1。不带任何操作符和使用-n操作符测试一个串结果是一样的,例如:$str1=abce$test $str1$echo $?结果显示:0$test -n $str1$echo $?结果显示:0但是,上面两条命令也有一点差别,反映出了使用test命令潜在的问题,请看下例:$str1=$test $str1$echo $?结果显示:1$test -n $str1$echo $?结果显示:0$test -n $str1结果显示:test:argument expected上例中,第一次测试为假因为Sh

36、ell在执行命令行之前首先要进行变量替换,即把$str1换成空格,然后shell又将命令行上的空格删除,故 test命令测试到的为空串。而在第二次测试中,变量替换后空格位于括号内,故不会被删除,test测试到的是一个包含空格的串,在第三次测试中, shell把空格删除,只把-n传个test命令,所以显示参数错。2测试两个整数之间关系test命令与expr命令一样,也可以把字符转变成整数,然后对其操作。test命令对两个数进行比较,使用的操作符如下:int1 -eq int2两数相等为真int1 -ne int2两数不等为真int1 -gt int2int1大于int2为真int1 -ge in

37、t2int1大于等于int2为真int1 -lt int2int1小于int2为真int1 -le int2int1小于等于int2为真下面的例子反映了字符串比较与数字比较的不同:$str1=1234$str2=01234$test $str1 = $str2$echo $?结果显示:1$test $str1 -eq $str2$echo $?结果显示:03有关文件的测试使用test进行的第三类测试是测试文件的状态,用户可以测试文件是否存在,是否可写以及其他文件属性。下面是文件测试时使用的选项。注意只有文件存在时,才有可能为真。-r file用户可读为真-w file用户可写为真-x file用户可执行为真-f file文件为正规文件为真-d file

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁