Linux操作系统第7讲Shell程序设计_第1页
Linux操作系统第7讲Shell程序设计_第2页
Linux操作系统第7讲Shell程序设计_第3页
Linux操作系统第7讲Shell程序设计_第4页
Linux操作系统第7讲Shell程序设计_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7讲Shell程序设计Shell的含义Shell既是一种命令语言,又是一种程序设计语言作为命令语言,它交互式地解释和执行用户输入的命令作为程序设计语言,它定义了各种变量和参数,并提供了在高级语言中才有的控制结构,如循环和分支。目前流行的Shellash:Linux中占用资源最少的一个小Shell,它只包含24个内部命令bash:Linux系统默认的Shell,包含40个内部命令,基于GNU架构发展而来。ksh:与商业发行版的ksh兼容,包含42个内部命令,由AT&TBelllab.发展而来,兼容于bashcsh:是Linux比较大的内核,共包含52个内部命令,BillJoy设计依附亍BSD版zsh:是Linux最大的Shell之一,共包含84个内部命令,若没有特殊用途,没有必要安装。Bash的功能命令记忆能力,可多达上千个,上次登录执行过的命令记在~/.bash_history,本次在内存命令补全功能,按[Tab]键shellscripts通配符:*,?Shell基本语法输入输出重定向“>”

输出重定向到一个文件“>>”

输出追加到一个文件“<”

输入重定向管道“|”前台与后台前台:command后台:command&Shell常用命令bash命令解释程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由shell本身提供。1.echo命令格式:echoarg功能:在屏幕上打印出由arg指定的字符串。2.eval命令格式:evalargs功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。Shell常用命令3.exec命令格式:exec命令命令参数功能:当shell执行到exec语句时,不去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序中exec后面的语句将不再被执行。4.export命令格式:export变量名或:export变量名=变量值功能:shell可以用export把它的变量向下带入子shell从而让子进程继承父进程中的环境变量。但子shell不能用export把它的变量向上带入父shell。注意:不带任何变量名的export语句将显示出当前所有的export变量。Shell常用命令5.readonly命令格式:readonly变量名功能:将一个用户定义的shell变量标识为不可变的。不带任何参数的readonly命令将显示出所有只读的shell变量。6.read命令格式:read变量名表功能:从标准输入设备读入一行,分解成若干字,赋值给shell程序内部定义的变量。7.shift语句功能:shift语句按如下方式重新命名所有的位置参数变量:$2成为$1,$3成为$2……在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数“$#”减一,直到减到0。Shell常用命令8.wait功能:是shell等待在后台启动的所有子进程结束。Wait的返回值总是真。9.exit功能:退出shell程序。在exit之后可有选择地指定一个数字作为返回状态。10.“.”(点)命令格式:.Shell程序文件名功能:使shell读入指定的shell程序文件并依次执行文件中的所有语句。创建和执行shell程序1.创建一个别名文件:(bash)示范文件myenv,内容如下:

#!/bin/bashclear cal echohello!!!2.在Linux下可以用以下方法来执行mynev. chmod命令:#chmod+xmynev3.执行shell程序

命令行上:#./mynev说明:以#开始行表示注释变量

3种类型:环境变量:系统提供,不用定义,可以修改内部变量:系统提供,不用定义,不能修改用户变量:定义,可以修改与其他语言的区别:非类型性质,也就是不必指定变量是数字或字符串等。用户变量举例例1:字符串变量赋值shell程序my1:

var=”string”newvar=”Valueofvaris$var”echo$newvar执行shell程序my1,可得到如下的结果:

Valueofvarisstring例2:数值变量赋值shell程序mynu:

x=15 echo$x得到如下的结果:

15

变量赋值给变量赋值locunt=0访问变量值lcount=$var例如要把var的值赋给变量lcountlcount=$var进行数值运算:(把var的值加5赋给lcount)lcount=$(($var+5))或letlcount=$var+5或lcount=`expr$var+5`环境变量(注意:变量名大写)echo$PATH指令ls完整文件名为:/bin/ls(这是绝对路径),为什么我在任何目录下输入ls都可以显示呢?这是因为环境变量PATH中的定义!例如[root@www~]#echo$PATH/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

记录所有搜索路径环境变量还有HOME、MAIL、SHELL

常见的环境变量PATH:决定了shell将到哪些目录中寻找命令或程序。HOME:当前用户主目录。UID:用户ID。MAIL:当前用户的邮件存放目录。SHELL:当前用户用的是哪种Shell。HISTSIZE:保存历史命令记录的条数LOGNAME:当前用户的登录名。HOSTNAME:主机的名称。内部变量部分内部变量及其作用变量作用

$#传给shell程序的位置参数的数目

$?最后命令的完成码或在shell程序内所执行的shell程序

$0shell程序的名称

$*调用shell程序所传送的全部变元的单字符串

my2的示范例子:echo“Numberofparametersis”$#echo“Shellreturncodeis”$?echo“Programnameis”$0echo“Parametersasasinglestringis”$*在bash中,如果从命令行中执行my2如下:#./my2wangzhang将得到如下的结果:Numberofparametersis2Programnameismy2

Parametersasasinglestringiswangzhang特殊字符双引号在字符串含有嵌入的空格时,用双引号括起来。这是一个有关bash的例子:

var=”teststring”newvar=”Valueofvaris$var”echo$newvar执行上面的三行shell程序,可得到如下的结果:./my1

Valueofvaristeststring单引号利用单引号把字符括起来,以阻止shell解析变量。把前面的双引号改为单引号,执行程序可得到如下的结果:./my11

Valueofvaris$var特殊字符

字符说明

$指出shell变量名的开始

|把标准输出通过管道传送到下个命令

#标记注释开始

&在后台执行进程>输出重定向操作符

<输入重定向操作符

>>输出重定向操作符{添加到文件}<<跟在输入结束自符串后(HERE)操作符.filmname执行(“源”)filename文件空格在两个字之间的间隔符通配符字符说明?匹配一个字符*匹配一个或几个字符

[]列出字符的范围,例如[abcd]

[a-z]意指a到z的全部字符

[a,z]意指a或z字符特殊字符反斜杠

在某个字符前利用反斜杠可以阻止shell把后面的字符解释为特殊字符。例如,把$test的值赋给变量var。输入如下命令:

var=$test如下命令才把$test存放在var中:

var=\$test

见例子./my111反引号:通知shell执行由反引号定义的字符串。

wc当需要把执行命令的结果存放在变量中时,就可以在shell程序中利用反引号。例如,要统计当前目录下一个文件中test.txt有几行并把结果存在叫做var的变量中:

var=`wc-ltest.txt`pdksh和bash环境见例子./my1111分支语句ifif语句

if语句通过判断逻辑表达式来作出选择,在pdksh和bash中的条件语句有如下的格式:if[expression];thenstatementselif[expression];thenstatementselsestatementsfiif条件是可以嵌套的,

位置参数及if语句

下述是一个shell程序的my3,只带了一个参数(名字),并在屏幕上显示这个名字:

#Namedisplayprogramif[$#-eq0];thenecho“Namenotprovided”elseecho”Yournameis”$1 fi

在bash中,如果执行mypgm1如下:

#./my3

将得到输出:

Namenotprovided

但是,如果执行mypgm1如下:

#./my3wang

则得到如下的输出:

Yournameiswang

位置参数

如果把程序my4修改为:

#Namedisplayprogramif[$#-eq0];thenecho“Namenotprovided”elseecho”Yournameis$2” fi

在bash中,如果执行mypgm1如下:

#./my4

将得到输出:

Namenotprovided

但是,如果执行mypgm1如下:

#./my4wangzhang

则得到如下的输出:

Yournameiszhang

mypgm1还说明了shell编程的另一个方面,即内部变量。在mypgm1中的变量$#是内部变量,并提供传给shell程序的位置参数的数目。设计一个Shell程序,读入一个正整数,如果是奇数显示“odd”,如果是偶数显示“even”。readxlety=$x/2*2if[$y–eq$x];thenecho“even”elseecho“odd”fi见例子./if测试文件f1是否存在,若存在删除它,不存在建立文件f1

测试目录/root/u1是否存在,若存在删除它,不存在建立它Shell程序设计流程控制bash表达式的比较1.字符串比较

=比较两个字符串是否相等

!=比较两个字符串是否不相等

-n判断字符长度是否大于零

-z判断字符长度是否等于零bash表达式的比较2.数字比较

-eq比较两个数是否相等

-ge比较一个数是否大于或是等于另一个数

-le比较一个数是否小于或是等于另一个数

-ne比较两个数是否不等

-gt比较一个数是否大于另一个数

-lt比较一个数是否小于另一个数bash表达式的比较3.文件操作符

-d确定文件是否为目录

-f确定文件是否为普通文件

-r确定是否对文件设置了读许可。

-s确定文件名是否具有大于零的长度

-w确定文件是否设置了写许可

-x确定文件是否设置了执行许可bash表达式的比较4.逻辑操作符

逻辑操作符用来根据逻辑规则比较表达式。!,-a,-o字符表示NOT、AND和OR!求反(”非”)逻辑表达式

-a逻辑AND(”与”)两个逻辑表达式

-o逻辑OR(”或”)两个逻辑表达式循环语句for语句第一种格式如下:

forcurvarinlistdostatementsdone

对list中的每个值需要执行一次statements时应利用这种格式。对每次循环,把list中的当前值赋给变量curvar,list可以使含有几个项的变量,或是用空格分隔的值表。For语句的这种格式是由pdksh和bash使用的。循环语句1.for语句假设需要把目录中的每个文件在一个叫做backup的子目录中建立备份,可以在bash

中执行如下的程序:

mkdirbackup forfilein*.txtdocp$filebackup/$filedone

执行后把当前目录下的.c为后缀的文件拷贝到子目录backup下见例子./my5求前5个自然数之和见例子./my6循环语句while语句格式如下:

whileexpression

dostatementsdone

循环语句前

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论