第11章Shell的使用_第1页
第11章Shell的使用_第2页
第11章Shell的使用_第3页
第11章Shell的使用_第4页
第11章Shell的使用_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、第11章 Shell的使用对于学习过对于学习过DOS命令的人都知道从命令行输入命令。每次命令的人都知道从命令行输入命令。每次输入一个命令,可得到系统的响应。但是有时间需要一下子连输入一个命令,可得到系统的响应。但是有时间需要一下子连续执行好几个命令,才能得到最后的结果。然后在续执行好几个命令,才能得到最后的结果。然后在linux环境中环境中,大家可以利用,大家可以利用shell程序或程序或shell脚本来实现这一目的。脚本来实现这一目的。Shell程序是通过文本编辑程序放在一个文件中的一系列程序是通过文本编辑程序放在一个文件中的一系列Linux命令命令和实用程序。当和实用程序。当shell在执

2、行在执行shell程序时,程序时,Linux系统会非常自系统会非常自然的一个接一个地解释和执行输入的每一个命令。然的一个接一个地解释和执行输入的每一个命令。Shell就是为就是为了在终端运行程序,是操作系统的一部分,用来与用户打交道了在终端运行程序,是操作系统的一部分,用来与用户打交道,并且可以用来协调各个命令。,并且可以用来协调各个命令。可以像在可以像在Linux下执行任何其他命令一样编写并执行下执行任何其他命令一样编写并执行shell程序。可以在程序。可以在shell程序内执行其它的程序内执行其它的shell程序,只要这些程序,只要这些shell程序在查找路径中。程序在查找路径中。shel

3、l程序跟其他任何高级语言一样程序跟其他任何高级语言一样,具有其自己的语法特点。例如定义变量、条件语句、循环特,具有其自己的语法特点。例如定义变量、条件语句、循环特点等。本章将讨论这些内容。点等。本章将讨论这些内容。11.1 创建和执行创建和执行shell程序程序 学习脚本编程的目的是实现在有些场合用一个命令来学习脚本编程的目的是实现在有些场合用一个命令来实现一些常用的命令集或者处理某些特定的问题,避免多次实现一些常用的命令集或者处理某些特定的问题,避免多次输入同一命令集的麻烦。对于不同的输入同一命令集的麻烦。对于不同的shell程序而言,其编程序而言,其编程语法也有所不同。常见的程语法也有所不

4、同。常见的shell脚本是脚本是bash和和tcsh,其命,其命令和语法与令和语法与C语言类似。语言类似。Shell脚本编程的准备工具为文本编辑器(脚本编程的准备工具为文本编辑器(vi、vim、gedit等)、脚本解释程序(等)、脚本解释程序(bash、tcsh等)、其他工具(等)、其他工具(用来扩充用来扩充Shell 脚本的功能,如:脚本的功能,如:grep、wc等)。等)。shell脚脚本是指使用用户环境本是指使用用户环境shell提供的语句所编写的提供的语句所编写的Linux命令文命令文件。可以利用文字编辑器进行程序录入和编辑加工来建立件。可以利用文字编辑器进行程序录入和编辑加工来建立s

5、hell程序,与建立普通文本文件的方式相同。程序,与建立普通文本文件的方式相同。 接下来将举例介绍其创建与执行。接下来将举例介绍其创建与执行。(1)在)在bash环境下创建一个环境下创建一个shell别名文件,命名为别名文件,命名为example。用文本编辑器编辑其文件内容如下:。用文本编辑器编辑其文件内容如下:alias search=whereisalias dir=lsalias copy=cp(2)Linux下可以使用多种方法来执行下可以使用多种方法来执行shell程序。程序。#chmod+x byname /使用使用chmod命令来执行。命令来执行。#echo $PATH /查找路径

6、命令。查找路径命令。在不同的环境中,执行在不同的环境中,执行shell脚本的命令是不一样。例脚本的命令是不一样。例如,还可以从命令行上执行如下表:如,还可以从命令行上执行如下表:11.2 变量Linux下的下的shell编程已经是一种非常成熟的编程语言。编程已经是一种非常成熟的编程语言。其支持各种类型的变量,共有其支持各种类型的变量,共有3种主要的变量类型:种主要的变量类型:环境变量:用户不必去定义环境变量,就可以直接在环境变量:用户不必去定义环境变量,就可以直接在shell程序中使用。因为其为系统环境的一部分,由系统创程序中使用。因为其为系统环境的一部分,由系统创建和赋值。某些变量还能在建和

7、赋值。某些变量还能在shell程序中进行修改,例如,程序中进行修改,例如,用户可以通过相应的环境变量来改变系统默认的命令提示符用户可以通过相应的环境变量来改变系统默认的命令提示符形式;形式;内部变量:由系统提供。与环境变量不同,其不能被内部变量:由系统提供。与环境变量不同,其不能被用户修改;用户修改;用户变量:在编写用户变量:在编写shell过程中由用户定义的。可以在过程中由用户定义的。可以在shell程序内任意使用和修改。这种变量只对用户有意义,程序内任意使用和修改。这种变量只对用户有意义,不会对系统产生影响;不会对系统产生影响;shell编程和其他编程的主要区别是编程和其他编程的主要区别是

8、shell编程中的变量编程中的变量是非类型性质的。是非类型性质的。11.2.1 给变量赋值给变量赋值 在编程过程中,需要对其进行赋值才能实现变量的真在编程过程中,需要对其进行赋值才能实现变量的真正价值,在正价值,在shell编程中也不例外。编程中也不例外。 注意:在注意:在pdksh和和bash环境下,必须确保在等号(环境下,必须确保在等号()前后没有空格。)前后没有空格。shell编程语言中使用的变量为非类型性质的变量。同编程语言中使用的变量为非类型性质的变量。同一变量在同一程序中被赋值成不同类型来使用是可能的。例一变量在同一程序中被赋值成不同类型来使用是可能的。例如,一个变量可以一次用来存

9、放数值类型另一次存放字符串如,一个变量可以一次用来存放数值类型另一次存放字符串。但是,应该注意尽量避免这样做。但是,应该注意尽量避免这样做。 如果字符串中不含空格,就可以通过上述命令实现。如果字符串中不含空格,就可以通过上述命令实现。但是,如果字符串中包含有空格话,就要对申明的字符串用但是,如果字符串中包含有空格话,就要对申明的字符串用单引号扩起来。可以通过如下语句对字符串变量进行赋值:单引号扩起来。可以通过如下语句对字符串变量进行赋值:11.2.2 访问变量在在shell程序中要访问变量,可以通过变量名前加程序中要访问变量,可以通过变量名前加“$”(美元符)的形式来访问变量的值。例如,有个变

10、量(美元符)的形式来访问变量的值。例如,有个变量var,通过通过$var的形式就可以对这个变量进行访问了。还可以把变的形式就可以对这个变量进行访问了。还可以把变量量var的值赋给变量的值赋给变量counter。实现变量间的值传递可以通过。实现变量间的值传递可以通过如下命令:如下命令:表11.5 访问变量命令环境counter$varPdksh和bashset counter$vartcsh11.3 位置参数位置参数是位置参数是Shell程序的一种变量,由被调用的命令行程序的一种变量,由被调用的命令行中的各自的位置决定。位置参数之间应用空格分开,通常是中的各自的位置决定。位置参数之间应用空格分开

11、,通常是跟在程序名后面的参数。跟在程序名后面的参数。Shell取第一个位置参数替换程序取第一个位置参数替换程序文件中的文件中的$1,第二个替换,第二个替换$2,依次类推。,依次类推。$0是一个特殊的是一个特殊的变量,其内容是当前这个变量,其内容是当前这个Shell程序的文件名,因此,程序的文件名,因此,$0不不是一个位置参数,在显示当前所有的位置参数时是不包括是一个位置参数,在显示当前所有的位置参数时是不包括$0的。的。例如,例如,shell程序程序myname要求两个参数(如名和姓)要求两个参数(如名和姓),可以只用一个参数,可以只用一个参数(名名)来调用来调用shell程序。但是,你不能只

12、程序。但是,你不能只利用第二个参数利用第二个参数(姓姓)来调用来调用shell程序。这里有一个程序。这里有一个shell程程序序myname,只带了一个参数,只带了一个参数(名字名字),并在屏幕上显示这个,并在屏幕上显示这个名字:名字:(1)编写)编写shell代码。代码。#Name display programIf($# -eq 0)ThenEcho “Name not provided”ElseEcho “Your name is ”$1(2)执行)执行myname,将得到输出结果为,将得到输出结果为Name not provided。# . myname(3)执行)执行mypgm1。#

13、 . myname windy(4)得到正确输出结果。)得到正确输出结果。Your name is windyshell程序程序myname还说明了还说明了she11编程的另一个方面,即内部变量编程的另一个方面,即内部变量。在。在myname中的变量中的变量$ #是内部变量,并提供传送给是内部变量,并提供传送给shell程序的位置参程序的位置参数的数目。数的数目。 11.4 内部变量内部变量是内部变量是Linux系统提供的一种用于作出判定的特殊类型的变量系统提供的一种用于作出判定的特殊类型的变量。在。在shell程序内用户时不能修改的这些变量的。下面是一些常用到的部程序内用户时不能修改的这些变

14、量的。下面是一些常用到的部分内部变量:分内部变量:$ #:传送给:传送给shell程序的位置参数的数目。程序的位置参数的数目。$?:最后命令的完成码或在?:最后命令的完成码或在shell程序内所执行的程序内所执行的shell程序。程序。$ 0:shell程序的名称。程序的名称。$ *:调用:调用shell程序时所传送的全部变元的单字符串。程序时所传送的全部变元的单字符串。为了表明这些内部变量的用法,这里有一个为了表明这些内部变量的用法,这里有一个myname的示范例子:的示范例子:(1)编写代码过程。)编写代码过程。#my =2#na=mypag2#nu=james#echo “Number

15、of parameters is ” $my#echo “Program name is ” $na#echo “Paramerts as a single string is ”$nu(2)执行)执行myname示例。示例。# . mypgm2 Sanjiv Guha(3)输出结果显示。)输出结果显示。Number of parameters is 2Program name is mypgm2Parameters as a single string is james11.5 特殊字符在在Linux shell程序中对某些特殊字符规定了特殊的含程序中对某些特殊字符规定了特殊的含义。在程序中

16、对其进行使用时,一般不要将其作为变量名或义。在程序中对其进行使用时,一般不要将其作为变量名或字符串的一部分。因为这样往往会导致程序出错。如果用户字符串的一部分。因为这样往往会导致程序出错。如果用户一定要在某些字符串中含有这类特殊字符的话,必须利用转一定要在某些字符串中含有这类特殊字符的话,必须利用转义字符反斜杠(义字符反斜杠()来实现。表明在此处该特殊字符不作为)来实现。表明在此处该特殊字符不作为特殊字符来处理。在下表中介绍了部分特殊字符极其特殊含特殊字符来处理。在下表中介绍了部分特殊字符极其特殊含义:义:11.5.1 双引号当字符串中含有空格时,应该用双引号(当字符串中含有空格时,应该用双引

17、号(“)括起来)括起来。这样做的目的是为了让。这样做的目的是为了让shell将其作为一个整体来解释该将其作为一个整体来解释该字符串。字符串。 双引号还会按照要求来解析字符串内的所有变量。下双引号还会按照要求来解析字符串内的所有变量。下面是两个不同的示例过程:面是两个不同的示例过程:(1)pdksh和和bash环境下的编写过程。环境下的编写过程。string=hello wordnewstring=The value of string is $stringecho $newstring(2)tcsh环境下的编写过程。环境下的编写过程。set string=hello wordset newst

18、ring=The value of string is $stringecho $newstring(3)两个例子的结果都为如下输出。)两个例子的结果都为如下输出。The value of string is hello word11.5.2 单引号单引号 用单引号(用单引号()将字符串括起来的目的是阻止)将字符串括起来的目的是阻止shlle对该对该字符串中的变量进行解析。下面将上节例子中的双引号改为字符串中的变量进行解析。下面将上节例子中的双引号改为单引号为例来对比说明以使读者加深理解。单引号为例来对比说明以使读者加深理解。(1)pdksh和和bash环境中。环境中。string=hello

19、 wordnewstring=The value of string is $stringecho $newstring(2)tcsh环境中。环境中。set string=hello wordset newstring=The value of string is $stringecho $newstring(3)两个例子的结果都为如下输出。)两个例子的结果都为如下输出。The value of string is $string通过上述例子可发现变量通过上述例子可发现变量string没有被没有被shell解析。解析。11.5.3 反斜杠在特殊字符前加上反斜杠(在特殊字符前加上反斜杠()可以阻

20、止)可以阻止shell将该字符将该字符解释为特殊字符。例如,要将解释为特殊字符。例如,要将$hello值赋给名为值赋给名为str的变量。的变量。如果直接赋值的话,如果直接赋值的话,shell将会把将会把“$hello”解析为变量解析为变量hello的值。那么如果程序中没有定义名为的值。那么如果程序中没有定义名为hello变量的话,存放变量的话,存放在变量在变量str中的值将是一个空值。而并不能达到预期的赋值中的值将是一个空值。而并不能达到预期的赋值目的。目的。 11.5.4 反引号反引号(反引号()用来通知)用来通知shell执行由反引号所定义的字符执行由反引号所定义的字符串。在串。在shel

21、l程序中,其可以将括起来的命令执行后的结果程序中,其可以将括起来的命令执行后的结果存放在定义的变量中。例如,当前目录下有个名为存放在定义的变量中。例如,当前目录下有个名为text.txt的文本文件,要对其中的字数进行统计并将结果存放在变量的文本文件,要对其中的字数进行统计并将结果存放在变量num中。编写如下内容:中。编写如下内容:#count how many chars in the text.txtnum=wc -w text.txtecho “There are $num chars in the text.txt.”11.6 表达式的比较执行两种操作符(数字或字符串)的逻辑比较是稍有执

22、行两种操作符(数字或字符串)的逻辑比较是稍有不同的,这取决于处在哪个不同的,这取决于处在哪个shell中。在中。在pdksh和和bash中,中,有一个叫做有一个叫做test的命令可以用来完成表达式的比较。在的命令可以用来完成表达式的比较。在tcsh中,可以编写一个表达式来完成同样的比较。中,可以编写一个表达式来完成同样的比较。pdksh和和bash环境下对环境下对test命令的处理是相同的。下命令的处理是相同的。下面来介绍一下面来介绍一下test命令支持的比较类型:命令支持的比较类型:(1)字符串比较,主要用来比较两个字符串的表达式)字符串比较,主要用来比较两个字符串的表达式的操作符。的操作符

23、。=:比较两个字符串是否相等。:比较两个字符串是否相等。!=:比较两个字符串是否不相等。:比较两个字符串是否不相等。-n:判定字符串的长度是否大于零。:判定字符串的长度是否大于零。-z:判定字符串长度是否等于零。:判定字符串长度是否等于零。 (2)数字比较,下面这些操作符可用于对两个数字间)数字比较,下面这些操作符可用于对两个数字间的比较。的比较。-eq:比较两个数是否相等。:比较两个数是否相等。-ge:比较一个数是否大于或等于另一个数。:比较一个数是否大于或等于另一个数。-le:也比较一个数是否小于或等于另一个数。:也比较一个数是否小于或等于另一个数。-ne:比较两个数是否不等。:比较两个数

24、是否不等。-gt:比较一个数是否大于另一个数。:比较一个数是否大于另一个数。-lt:比较一个数是否小于另一个数。:比较一个数是否小于另一个数。(3)文件操作符,下面这些操作符可用于文件的比较)文件操作符,下面这些操作符可用于文件的比较。-d:确定文件是否为目录。:确定文件是否为目录。-f:确定文件是否为普通文件。:确定文件是否为普通文件。-r:确定对文件是否设置读许可。:确定对文件是否设置读许可。-s:确定文件名是否具有大于零的长度。:确定文件名是否具有大于零的长度。-w:确定对文件是否设置写许可。:确定对文件是否设置写许可。-x:确定对文件是否设置执行许可。:确定对文件是否设置执行许可。11

25、.7 循环语句循环语句是用来对循环语句内包含的一系列命令重复循环语句是用来对循环语句内包含的一系列命令重复执行多次。通常应用于比较复杂的计算之中,往往通过循环执行多次。通常应用于比较复杂的计算之中,往往通过循环语句把一个复杂化的问题变得简单易操作。因此其是一个用语句把一个复杂化的问题变得简单易操作。因此其是一个用于提高效率的语句。在本章将对其主要类型进行介绍。于提高效率的语句。在本章将对其主要类型进行介绍。11.7.1 for语句(1)for语句实现循环的一种格式。语句实现循环的一种格式。for (expression1;expression2;expression3)dostatements

26、Done(2)for语句实现循环的另一种格式:语句实现循环的另一种格式:for indostatementsdone11.7.2 while循环语句当指定的条件为真时,当指定的条件为真时,while语句会循环执行循环体内语句会循环执行循环体内的命令。一旦所指定的条件为假时,则立即终止循环。如果的命令。一旦所指定的条件为假时,则立即终止循环。如果所指定的条件一开始就被判定为假,则一次都不执行循环。所指定的条件一开始就被判定为假,则一次都不执行循环。在使用在使用while语句时,若所指定的条件永不为假,则循环就语句时,若所指定的条件永不为假,则循环就永不终止。读者在编写永不终止。读者在编写shel

27、l程序时应注意这个问题,避免程序时应注意这个问题,避免产生死循环现象。产生死循环现象。(1)while语句在语句在pdksh和和bash环境中使用格式。环境中使用格式。while do statementsdone11.7.3 until语句until语句会根据指定的条件循环执行循环体中的命令语句会根据指定的条件循环执行循环体中的命令,直到所指定的条件判定为真则终止循环。,直到所指定的条件判定为真则终止循环。until语句在语句在pdksh和和bash环境中的格式如下:环境中的格式如下:until dostatementsdoneuntil语句类似于语句类似于while语句。只是其为当判定条件

28、为真语句。只是其为当判定条件为真时,才终止循环。读者可参照时,才终止循环。读者可参照while语句的用法,这里就不语句的用法,这里就不做过多的介绍。做过多的介绍。11.7.4 repeat语句repeat语句用于重复执行规定次命令。例如,要连续语句用于重复执行规定次命令。例如,要连续显示数字显示数字“repeat”8次可以执行如下:次可以执行如下:repeat 8 echo repeat11.7.5 select语句 当编写一个需要联机输入的当编写一个需要联机输入的shell程序时,程序时,select语句语句就可用来生成一个菜单列表。其格式如下:就可用来生成一个菜单列表。其格式如下:sele

29、ct in dostatementsdone其中其中itemlist为可选。当编写者未给出为可选。当编写者未给出itemlist时,系时,系统将通过统将通过item中的项每次重复一个。当给出中的项每次重复一个。当给出temlist时,系时,系统会将统会将itemlist列表中的当前值赋给列表中的当前值赋给item,这样,这样item就可用就可用作为所执行语句的一部分。作为所执行语句的一部分。11.7.6 shift语句shift语句用来处理位置参数并从左到右依次处理一个语句用来处理位置参数并从左到右依次处理一个参数。位置参数是用参数。位置参数是用$1、$2、$3等来标识的。等来标识的。shif

30、t命令的命令的作用就是将每个位置参数向左移动一个位置使当前的参数丢作用就是将每个位置参数向左移动一个位置使当前的参数丢失。失。Shift语句的格式如下:语句的格式如下:shift num参数参数num是可选的,用于指定移动的次数。其缺省值是可选的,用于指定移动的次数。其缺省值为为1,即参数向左移动一个位置。若指定了这个参数则系统,即参数向左移动一个位置。若指定了这个参数则系统将使位置参数向左移动将使位置参数向左移动num个位子。在个位子。在shell程序中,程序中,shift命令用于使用户能够在程序中传送不同的选项。命令用于使用户能够在程序中传送不同的选项。11.8 条件语句shell程序中所

31、利用的条件语句是根据所指定的条件来程序中所利用的条件语句是根据所指定的条件来确定执行程序的哪个部分。通俗的说就是当处理一件事情时确定执行程序的哪个部分。通俗的说就是当处理一件事情时,有多种可处理的方法,但是只能从可选择处理方法中选取,有多种可处理的方法,但是只能从可选择处理方法中选取一种作为最佳的方案。一种作为最佳的方案。11.8.1 if语句if语句根据判定逻辑表达式来作出选择。其语法与语句根据判定逻辑表达式来作出选择。其语法与C语言中语言中的,的,if语句用法基本相同。在语句用法基本相同。在pdksh和和bash环境中,此语句最基环境中,此语句最基本的格式如下:本的格式如下:if then

32、 statements1else statements2fi上述表达式中,参数概念如下:上述表达式中,参数概念如下:为一个条件表达式,是一个逻辑值。为一个条件表达式,是一个逻辑值。Statements1、statements2都为执行语句部分,由若干个都为执行语句部分,由若干个命令组成。命令组成。当当判定为真时,则执行判定为真时,则执行statements1,然后结,然后结束束if语句并继续执行语句并继续执行if后面的语句。后面的语句。当当判定为假时,则执行判定为假时,则执行statements1,然后结,然后结束束if语句并继续执行语句并继续执行if后面的语句。后面的语句。11.8.2 ca

33、se语句当当if语句的出口分支比较多的时候,程序的可读性就会大大语句的出口分支比较多的时候,程序的可读性就会大大下降。为了提高可读性,就可以使用下降。为了提高可读性,就可以使用case语句来实现。语句来实现。(1)pdksh和和bash环境下,环境下,case语句格式。语句格式。case instring1) statements1;string2) statements2;*)statements;Esac11.9 跳转语句通过前面的学习,大家应该知道了通过前面的学习,大家应该知道了shell的基本编写方的基本编写方法。顺序,选择,循还的使用,在此还有另外的两个特殊语法。顺序,选择,循还的使

34、用,在此还有另外的两个特殊语句要讲:句要讲:break语句。语句。break语句可以用来终止重复执行的循环。这种循环可语句可以用来终止重复执行的循环。这种循环可以是以是for、until或或repeat命令。命令。 exit语句。语句。exit语句可以用来在执行语句可以用来在执行shell程序时退出程序。在程序时退出程序。在exit之后可有选择地利用一个数字。其放置的位置和之后可有选择地利用一个数字。其放置的位置和break相似相似,这里就不做过多的介绍。如果当前的,这里就不做过多的介绍。如果当前的shell程序被另一个程序被另一个shell程序调用,那么这个调用程序将检查代码并作出相应程序调

35、用,那么这个调用程序将检查代码并作出相应的判定。的判定。11.10 函数和其他编程语言一样,和其他编程语言一样,shell程序也支持函数。函数是程序也支持函数。函数是shell程序中执行特殊过程的部件,并在程序中执行特殊过程的部件,并在shell程序中可以被程序中可以被重复调用。编写函数将有助于使重复调用。编写函数将有助于使shell程序更加简洁易懂。程序更加简洁易懂。(1)pdksh和和bash环境中函数格式定义。环境中函数格式定义。func()statements(2)调用函数的格式。)调用函数的格式。func param1 param2 param3说明:参数说明:参数param1、param2等为可选。还能把参数等为可选。还能把参数作为单字符串来传送,例如作为单字符串来传送,例如$。函数可解析参数,就如同。函数可解析参数,就如同其传送给其传送给shell程序的位置参数一样。程序的位置参数一样。11.11 小 结在本章中,学习了如何编写在本章中,学习了如何编写shell程序,程序,shell程序可以用来编写执行简单任务的程序可以用来编写执行简单任务的程序。例如进入系统时设

温馨提示

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

评论

0/150

提交评论