在linux世界驰骋系列之shell编程


红联的个人空间 在Linux世界驰骋系列 作者:红联 在Linux世界驰骋系列 ─────Shell编程 Linux环境中,Shell不仅是常用的命令解释程序,而且是高级编程语言。本讲介绍Shell概述、Shell变 量、位置参数、特殊符号、别名、各种控制语句、函数等Shell编程知识。 Shell是Unix/Linux系统中一个重要的层次,它是用户与系统交互作用的界面。 Shell还是一种高级编程语言,它有变量、关键字,有各种控制语句。 内容基础,语言简短简洁 红联Linux论坛是致力于Linux技术讨论的站点,目前网站收录的文章及教程基本能满足不同水平的朋 友学习。 红联Linux门户: www.linux110.com 红联Linux论坛: www.linuxdiyf.com/bbs 红联Linux 论坛大全,所有致力点都体现在这 http://www.linuxdiyf.com/bbs/rf/linux/07.htm 博客:http://www.linux286.com/6/12/?3 1/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 目录 Shell编程 Shell概述 1.Shell的特点 2.常用Shell类型 3. Shell脚本的建立 4.执行Shell脚本的方式 Shell变量 1.用户定义的变量 2.数组 3.变量引用 4.交互输入变量值 5.位置参数 6. 预先定义的特殊变量 7.环境变量 8.参数置换变量 命令历史 别名 Shell特殊字符 1.一般通配符 2.模式表达式 3.引号 4.注释 命令执行操作符 算术运算 控制结构 1.if语句 2.条件测试 3.case语句 4. while语句 5.until语句 6.for语句 7.break命令和continue命令 函数 结语 海量Linux技术文章 博客:http://www.linux286.com/6/12/?3 2/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 Shell 编程 发布时间 :2006-11-20 20:58:57 网络转载-作者:孟庆昌 来源:赛迪技术天地-开放系统世界 Linux环境中,Shell不仅是常用的命令解释程序,而且是高级编程语言。本讲介绍Shell概述、Shell变量、位置 参数、特殊符号、别名、各种控制语句、函数等Shell编程知识。 Shell是Unix/Linux系统中一个重要的层次,它是用户与系统交互作用的界面。在以前介绍Linux命令时,Shell 都作为命令解释程序出现:它接收用户输入的命令,进行分析,创建子进程,由子进程实现命令所规定的功� 埽�茸咏�讨罩构ぷ骱蠓⒊鎏崾痉�U馐�Shell最常见的使用方式。 Shell还是一种高级编程语言,它有变量、关键字,有各种控制语句,如if、case、while、for等语句,支持函数 模块,有自己的语法结构。利用Shell程序设计语言可以编写出功能很强、但代码简单的程序。特别是它把相关 的Linux命令有机地组合在一起,可大大提高编程的效率,充分利用Linux系统的开放性能,能够设计出适合自 己要求的命令。 博客:http://www.linux286.com/6/12/?3 3/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 Shell 概述 发布时间 :2006-11-20 20:59:26 Shell的概念最初是在Unix操作系统中形成和得到广泛应用的。Unix的Shell有很多种类,Linux系统继承了Unix 系统中 Shell的全部功能,现在默认使用的是bash。 博客:http://www.linux286.com/6/12/?3 4/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 1.Shell 的特点 发布时间 :2006-11-20 20:59:47 Shell具有如下突出特点: (1)把已有命令进行适当组合构成新的命令。 (2)提供了文件名扩展字符(通配符,如* 、 ?、 [ ]),使得用单一的字符串可以匹配多个文件名,省去键入 一长串文件名的麻烦。 (3)可以直接使用Shell的内置命令,而不需创建新的进程,如Shell中提供的cd、echo、exit、pwd、kill等命令 。为防止因某些Shell不支持这类命令而出现麻烦,许多命令都提供了对应的二进制代码,从而也可以在新进程 中运行。 (4)Shell允许灵活地使用数据流,提供通配符、输入/输出重定向、管道线等机制,方便了模式匹配、I/O处理 和数据传输。 (5)结构化的程序模块,提供了顺序流程控制、条件控制、循环控制等。 (6)Shell提供了在后台执行命令的能力。 (7)Shell提供了可配置的环境,允许创建和修改命令、命令提示符和其它的系统行为。 (8)Shell提供了一个高级的命令语言,能够创建从简单到复杂的程序。这些Shell程序称为Shell脚本,利用 Shell脚本,可把用户编写的可执行程序与Unix命令结合在一起,当作新的命令使用,从而便于用户开发新的命 令。 博客:http://www.linux286.com/6/12/?3 5/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 2.常用Shell 类型 发布时间 :2006-11-20 21:00:09 Linux系统提供多种不同的Shell以供选择。常用的有Bourne Shell(简称sh)、C-Shelll(简称csh)、Korn Shell(简称ksh)和Bourne Again Shell (简称bash)。 (1)Bourne Shell是AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它 Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。 (2)C Shell是加州伯克利大学的Bill Joy为BSD Unix开发的,与sh不同,它的语法与C语言很相似。它提供了 Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与 BourneShell并不兼容。 (3)Korn Shell是AT&T Bell实验室的David Korn开发的,它集合了C Shell和Bourne Shell的优点,并且与 Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。 (4)Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell 。 Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。 博客:http://www.linux286.com/6/12/?3 6/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 3. Shell 脚本的建立 发布时间 :2006-11-20 21:00:34 Shell程序可以存放在文件中,这种被Shell解释执行的命令文件称为Shell脚本 (Shell scrī pt)。Shell脚本可以 包含任意从键盘键入的Linux命令。 建立Shell脚本的步骤同建立普通文本文件的方式相同,利用编辑器(如vi)进行程序录入和编辑加工。例如, 要建立一个名为ex1的Shell脚本,可在提示符后输入命令: $ vi ex1 进入vi的插入方式后,就可录入程序行。完成编辑之后,将编辑缓冲区内容写入文件中,返回到Shell命令状态 。 博客:http://www.linux286.com/6/12/?3 7/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 4.执行Shell 脚本的方式 发布时间 :2006-11-20 21:01:14 执行Shell脚本的方式基本上有三种: (1)输入定向到Shell脚本 这种方式是用输入重定向方式让Shell从给定文件中读入命令行并进行相应处理。其一般形式是: $ bash < 脚本名 例如: $ bash ”。 PWD 当前工作目录的路径,它指出目前在Linux文件系统中处在什么位置。 SHELL 当前使用的Shell,它也指出Shell解释程序放在什么地方。 TERM 终端类型。 可以使用unset命令删除一个环境变量(如NAME): $ unset NAME 可以创建一个新的环境变量,或者改变一个已有的环境变量的值,其形式与设置一般变量相同。如果变量值的 字符串中带有空格等特殊字符,需要用引号把整个字符串括起来。利用export命令可以将这些变量导出,使它 们成为公用量,如: export HOME HZ LOGNAME TERM 可以利用env命令列出所有的环境变量,包括本进程及以前的“祖先进程”所导出的变量。 博客:http://www.linux286.com/6/12/?3 17/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 8 .参数置换变量 发布时间 :2006-11-20 21:04:53 参数置换变量是另一种为变量赋值的方式,其一般形式是: 变量2=$ {变量1 op 字符串} 其中,op表示操作符,它可以是下列四个操作符之一“: :-”、“: =” 、“: +” 和“: ?”。变量2的值取决 于变量1(参数)是否为空串、利用哪个操作符及字符串的取值。在操作符的前后不留空格。 博客:http://www.linux286.com/6/12/?3 18/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 命令历史 发布时间 :2006-11-20 21:05:14 bash提供了命令历史功能,即系统为每个用户维护一个命令历史文件(~/.bash_history),它在注册用户的主目 录(用~表示)之下。该文件由编号的表格构成。每当注册后,用户输入命令并执行它时,该命令就自动地加 到这个命令历史表中。 使用命令历史机制,用户可以方便地调用或者修改以前的命令,可以把全部或部分先前命令作为新命令予以快 捷执行。这一功能称为历史替换(history substitution)。 ◆history命令可以显示命令历史表中的命令。其语法格式是: history [option][arg ?] (1)如果不带任何参数,则history命令会显示历史命令的清单(包括刚输入的history命令)。所有这些命令都被 称作事件,一个事件表示一个操作已经发生,即一个命令已被执行。显示的各行命令之前的数字表示相应命令 行在命令历史表中的序号,称为历史事件号。历史事件号从1开始顺序向下排,最后执行的命令的事件号最大 。 (2)如果history 后给出一个正整数,例如: history 50 那么,就只显示历史表中的最后50行命令。 (3)如果history后给出一个文件名,例如: history al 那么,就把al作为历史文件名。 ◆执行历史命令是命令替换之一,它以字符“!”开头、后随1个或多个字符来定义用户所需的某种类型的历 史命令。它可以出现在输入行的任何地方,除非已在进行历史替换。如果在“!”之前加上反斜线“\”,或者 在其后跟着空格、制表符、换行符、等号“=”或开括号“(”,那么“!”就作为普通字符对待,失去特殊意 义。 历史替换可以作为输入的命令行的一部分或全体。当输入行的正文中包含历史替换时,将在完成相应的替换后 ,在终端上显示输入的命令行,从而用户可以看到实际执行的命令(显示命令后立即执行)。 ◆在默认方式下,bash使用用户主目录下面的文件“.bash_history”来保存命令历史。但是,用户也可以通过 重新为环境变量HISTFILE赋值来改变存放历史命令的文件。例如: $ HISTFILE="/home/mengqc/.myhistory" 历史文件中能够保留的命令个数有限,其默认值是500。如果用户输入的命令太多,超过限定值,那么最早输 入的命令就会从历史表中删除,而新输入的命令会加到该表尾部。用户可以利用HISTSIZE变量重新设定该值 。例如: 博客:http://www.linux286.com/6/12/?3 19/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 $ HISTSIZE=600 通常用户不必对命令历史表进行管理(如设置HISTSIZE的值等),由系统自动管理。利用命令历史功能,用 户可以对先前输入的命令重新进行编辑、修改和执行,从而简化用户的操作。 博客:http://www.linux286.com/6/12/?3 20/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 别名 发布时间 :2006-11-20 21:05:32 使用别名可以简化输入,方便用户。对于常用的选项或参数较多的固定命令采用别名替换,既缩短击键次数, 又减少出错机率。 定义别名要使用Shell内部命令alias,其一般语法格式为: alias [name[=value]]⋯ 如果没有指定参数,将在标准输出(屏幕)上显示别名清单,其格式为name=value,其中name是用户(或系统)定 义的别名名称,value是别名所代表的内容。注意,在赋值号“=”两边不能有空格。 例如: $ alias ll=' ls -l ' 定义了别名ll,它代表“ls -l”。当输入ll命令后,Shell将寻找它们所维护的别名表(放在内存中的一个内部表格) 。若在该表中找到命令行的第一个字段 (即“ll”)时,该命令就会被别名定义的内容所替换。定义别名时,往 往用单引号将它代表的内容括起来,从而防止Shell对其中的内容产生歧义,如对空格和特殊字符另作解释。 如果想取消先前定义的别名,可使用如下命令: unalias name⋯ 执行后,就从别名表中删除由name指定的别名。 unalias也可以在一个命令上同时取消多个别名的定义,只须在unalias之后依次列出要取消的别名名称。也可以 一次将所有的别名都从别名表中删除,使用如下命令: unalias -a 博客:http://www.linux286.com/6/12/?3 21/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 Shell 特殊字符 发布时间 :2006-11-20 21:05:57 Shell中除使用普通字符外,还使用了一些特殊字符,它们有特定的含义,如通配符“*”和“?”、管道线(| )及单引号、双引号等。在使用时应注意它们表示的意义和作用范围。 博客:http://www.linux286.com/6/12/?3 22/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 1 .一般通配符 发布时间 :2006-11-20 21:06:37 通配符用于模式匹配,如文件名匹配、路径名搜索、字符串查找等。常用的通配符有四种: * 匹配任意字符0次或多次出现。例如,f*可以匹配以f 打头的任意字符串。但应注意,文件名前面的圆点( . ) 和 路径名中的斜线( / )必须显式匹配。 ? 匹配任意一个字符,例如,f ?匹配f1、fa、fb等,但不能匹配 f 、fabc、 f12等。 [ ] 其中有一个字符组,它匹配该字符组所限定的任何一个字符。该字符组可以由直接给出的字符组成,也 可以由表示限定范围的起始字符、终止字符及中间一个连字符(-)组成。例如,f[a-d]与f[abcd]作用相同。 ! 表示不在一对方括号中所列出的字符。例如,f[!1— 9].c 表示以f打头,后面一个字符不是数字1至9的.c文件名 ,它匹配fa.c、fb.c、fm.c等。 在一个正则表达式中,可以同时使用“*”和“?”。 博客:http://www.linux286.com/6/12/?3 23/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 2 .模式表达式 发布时间 :2006-11-20 21:07:00 模式表达式是那些包含一个或多个通配符的字。bash除支持一般通配符外,还提供了特有的扩展模式匹配表达 式,其形式和含义如下: (1)*(模式表) 匹配给定模式表中“模式”的0次或多次出现,各模式之间以“|”分开。例如,file*(.c|.o)将 匹配文件file、file.c、file.o、file.c.c、file.0.0、file.c.o、file.o.c等,但不匹配file.h或file.s等。 (2)+(模式表) 匹配给定模式表中“模式”的1次或多次出现,各模式之间以“|”分开。例如,file+(.c | .o)匹 配文件file.c、file.o、file.c.o、file.c.c等,但不匹配file。 (3)?(模式表) 匹配模式表中任何一种“模式”的0次或1次出现,各模式之间以“|”分开。例如,file?(.c| .o)只匹配file、file.c和file.0,它不匹配多个模式或模式的重复出现,即不匹配file. c. c、file. c. 0等。 (4)@(模式表) 仅匹配模式表中给定“模式”的一次出现,各模式之间以“|”分开。例如,file@(.c|.0)匹配 file.c和file.0,但不匹配file、file.c.c、file.c.o等。 (5)!(模式表) 除给定模式表中的一个“模式”之外,它可以匹配其它任何东西。 可以看出,模式表达式的定义是递归的,每个表达式中都可以包含一个或多个模式。例如file*( .[cho]|.sh)是合 法的模式表达式。但在使用时应注意,由于带“*”和“+”的表达式可以匹配给定模式的组合,若利用此种表 达式去删除文件就存在危险,有可能误将系统配置文件删除。因此,必须小心使用。 博客:http://www.linux286.com/6/12/?3 24/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 3 .引号 发布时间 :2006-11-20 21:07:19 在Shell中引号分为三种:单引号、双引号和倒引号。 (1)双引号 由双引号括起来的字符,除$、倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待。 “$”表示变量替换,即用其后指定的变量的值来代替$和变量;倒引号表示命令替换;仅当“\”后面的字符是 下述字符之一时,“\”才是转义字符,这些字符是:“$”、“`”、“"”、“\”或换行符。转义字符告诉 Shell不要对其后面的那个字符进行特殊处理,只是当作普通字符。例如: $ echo "My current dir is `pwd` and logname is $LOGNAME" My current dir is /home/mengqc and logname is mengqc (2)单引号 由单引号括起来的字符都作为普通字符出现。例如, $ echo 'The time is ` date ` , the file is $HOME/abc ' The time is ` date ` , the file is $HOME/abc (3)倒引号 倒引号括起来的字符串被shell解释为命令行,在执行时,Shell会先执行该命令行,并以它的标准输出结果取代 整个倒引号部分。在前面示例中已经见过。例如, $ echo current directory is ` pwd ` current directory is /home/mengqc 博客:http://www.linux286.com/6/12/?3 25/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 4 .注释 发布时间 :2006-11-20 21:07:38 Shell程序中以“#”开头的正文行表示注释。例如: #!/bin/bash # If no arguments, then listing the current directory. # Otherwise, listing each subdirectory. if test $# = 0 then ls · else for i do ls -l $i | grep '^d' done fi 上面程序由if语句构成,其中else部分是for循环语句。其功能是检测位置参数个数,若等于0,则列出当前目录 本身;否则,对于每个位置参数显示其所包含的子目录。 上面代码中,第一行#!/bin/bash表示下面的脚本是用bash编写的,必须调用bash程序对它解释执行。后面两行 以“ # ”开头,表示这是注释行。注释行可用来说明程序的功能、结构、算法和变量的作用等,增加程序的可 读性。在执行时Shell将忽略注释行。 博客:http://www.linux286.com/6/12/?3 26/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 命令执行操作符 发布时间 :2006-11-20 21:08:00 ◆多条命令可以在一行中出现。它们可以从左到右顺序执行。此时,各条命令之间应以分号( ;)隔开,如: pwd ; who | wc -l ; cd /usr/bin ◆在相邻命令间可存在逻辑关系,即逻辑“与”和逻辑“或”。 逻辑与操作符“&&”可把两个命令联系在一起,其一般形式: 命令1 && 命令2 其功能是先执行命令1,如果执行成功,才执行命令2;否则,若命令1执行不成功,则不执行命令2。例如: cp ex1 ex10 && rm ex1 如果成功地把文件ex1拷贝到文件ex10中,则把ex1删除。 逻辑或操作符“||”可把两个命令联系起来,其一般形式是: 命令1 || 命令2 其功能是先执行命令1,如果执行不成功,则执行命令2;否则,若命令1执行成功,则不执行命令2。例如: cat abc || pwd 如果不能将文件abc的内容列出来,则显示当前工作目录的路径。 ◆在Shell中有两种方式可以将若干命令组合在一起,使其在逻辑上被视为一条命令,它们是用花括号{ }将各命 令括起来和用圆括号( )括起来。 以花括号括起来的全部命令可视为语法上的一条命令,出现在管道符的一边。成组命令的执行顺序是根据命令 出现的先后次序,由左至右执行。在管道线中,成组命令把各命令的执行结果汇集在一起,形成一个输出流, 这个流作为该管道线中下一个命令的输入。例如, { echo "User Report for ` date ` . "; who ; } | pr 使用花括号时在格式上应注意:左括号 “{ ”后面应有一个空格;右括号“}”之前应有一个分号( ;)。 成组命令也可以用圆括号括起来。例如: (echo "Current directory is ` pwd ` . " cd /home/mengqc ; ls -l ; cp m1 em1 && rm m1 cat em1) | pr 博客:http://www.linux286.com/6/12/?3 27/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 如上所示,在用圆括号括起成组命令时,左括号后不必有空格,右括号之前也不需加上分号。 二者执行过程相同,但是存在重要区别:用花括号括起来的成组命令只是在本Shell内执行命令表,不产生新的 进程;而用圆括号括起来的成组命令是在新的子Shell内执行,要建立新的子进程。因此,在圆括号内的命令不 会改变父Shell的变量值及工作目录等。 博客:http://www.linux286.com/6/12/?3 28/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 算术运算 发布时间 :2006-11-20 21:08:26 bash中执行整数算术运算的命令是let,其语法格式为: let arg ⋯ 其中,arg是单独的算术表达式。这里的算术表达式使用C语言中表达式的语法、优先级和结合性。除++、--和 逗号(,)之外,所有整型运算符都得到支持。此外,还提供了方幂运算符“**”。命名的参数可以在算术表达式 中直接利用名称访问,不要前面带有“$”符号。当访问命名参数时,就作为算术表达式计算它的值。算术表 达式按长整数进行求值,并且不检查溢出。当然,用0作除数就产生错误。 let 命令的替代表示形式是: ((算术表达式)) 例如,let ″j=i*6+2″等价于((j=i*6+2))。 如果表达式的值是非0,那么返回的状态值是0;否则,返回的状态值是1。 当表达式中有Shell的特殊字符时,必须用双引号将其括起来。例如,let ″val=a|b″。如果不括起来,Shell会把 命令行let val=a|b中的“|”看成管道符,将其左右两边看成不同的命令,因而无法正确执行。 博客:http://www.linux286.com/6/12/?3 29/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 控制结构 发布时间 :2006-11-20 21:09:02 Shell具有一般高级程序设计语言所具有的控制结构和其它的复杂功能,如if语句、 case语句、循环结构、函数 等。其实在Shell中,这些控制结构也称作“命令”。为了程序设计的习惯,才把它们称作语句。 博客:http://www.linux286.com/6/12/?3 30/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 1.if 语句 发布时间 :2006-11-20 21:09:27 if语句用于条件控制结构中,其一般格式为: if 测试条件 then 命令1 else 命令2 fi 其中,if、then、else和fi是关键字。例如: if test -f "$1" then echo "$1 is an ordinary file . " else echo "$1 is not an ordinary file . " fi 应该注意,if语句中else部分可以缺省。另外,if 语句的else部分还可以是else— if结构,此时可以用关键字“elif ”代替“ else if”。 通常,if的测试部分是利用test命令实现的。其实,条件测试可以利用一般命令执行成功与否来作判断。如果命 令正常结束,则表示执行成功,其返回值为0,条件测试为真;如果命令执行不成功,其返回值不等于0,条件 测试就为假。所以if的语句的更一般形式是: if 命令表1 then 命令表2 else 命令表3 fi 博客:http://www.linux286.com/6/12/?3 31/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 2 .条件测试 发布时间 :2006-11-20 21:09:47 条件测试有三种常用形式:一种是用test命令,如上所示。另一种是用一对方括号将测试条件括起来。这两种 形式是完全等价的。例如,测试位置参数$1是否是已存在的普通文件,可写为test -f "$1"。也可写成[ -f "$1" ] 。利用一对方括号表示条件测试时,在左方括号“[”之后、右方括号“]”之前各应有一个空格。 第三种形式是: [[条件表达式]] test命令可以和多种系统运算符一起使用。这些运算符可以分为四类:文件测试运算符(文件的属性及权限等 )、字符串测试运算符(两个串是否相同及是否为空)、数值测试运算符(大小关系)和逻辑运算符(逻辑与 、或、非)。 博客:http://www.linux286.com/6/12/?3 32/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 3.case 语句 发布时间 :2006-11-20 21:10:09 case语句允许进行多重条件选择。其一般语法形式是: case 字符串 in 模式字符串1) 命令 ⋯ 命令;; 模式字符串2) 命令 ⋯ 命令;; ⋯ 模式字符串n) 命令 ⋯ 命令;; esac 其执行过程是用“字符串”的值依次与各模式字符串进行比较,如果发现同某一个匹配,那么就执行该模式字 符串之后的各个命令,直至遇到两个分号为止。如果没有任何模式字符串与该字符串的值相符合,则不执行任 何命令。 在使用case语句时应注意: (1)每个模式字符串后面可有一条或多条命令,其最后一条命令必须以两个分号(即;;)结束。 (2)模式字符串中可以使用通配符。 (3) 如果一个模式字符串中包含多个模式,那么各模式之间应以竖线(|)隔开,表示各模式是“或”的关系 ,即只要给定字符串与其中一个模式相配,就会执行其后的命令表。 (4)各模式字符串应是惟一的,不应重复出现。并且要合理安排它们的出现顺序。例如,不应将“*”作为头 一个模式字符串,因为“*”可以与任何字符串匹配,它若第一个出现,就不会再检查其它模式了。 (5)case语句以关键字case开头,以关键字esac(是case倒过来写!)结束。 (6)case的退出(返回)值是整个结构中最后执行的那个命令的退出值。若没有执行任何命令,则退出值为 零。 博客:http://www.linux286.com/6/12/?3 33/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 4. while 语句 发布时间 :2006-11-20 21:10:29 Shell中有三种用于循环的语句,它们是while语句、for语句和until语句。 while语句的一般形式是: while 测试条件 do 命令表 done 其执行过程是,先进行条件测试,如果结果为真,则进入循环体(do— done之间部分), 执行其中命令;然后再 做条件测试⋯⋯直至测试条件为假时才终止 while语句的执行。例如: while [ $1 ] do if [ -f $1 ] then echo "display : $1 " cat $1 else echo "$1 is not a file name . " fi shift done 这段程序对各个给定的位置参数,首先判断其是否是普通文件,若是,则显示其内容;否则,显示它不是文件 名的信息。每次循环处理一个位置参数$1,利用shift命令可把后续位置参数左移。 测试条件部分除使用test命令或等价的方括号外,还可以是一组命令。根据其最后一个命令的退出值决定是否 进入循环体执行。 博客:http://www.linux286.com/6/12/?3 34/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 5.until 语句 发布时间 :2006-11-20 21:10:47 until语句的一般形式是: until 测试条件 do 命令表 done 它与while语句很相似,只是测试条件不同:当测试条件为假时,才进入循环体,直至测试条件为真时终止循环 。 博客:http://www.linux286.com/6/12/?3 35/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 6.for 语句 发布时间 :2006-11-20 21:11:16 for语句是最常用的建立循环结构的语句。其使用格式主要有三种,取决于循环变量的取值方式。 格式一: for 变量 in 值表 do 命令表 done 例如: for day in Monday Wednesday Friday Sunday do echo $day done 其执行过程是,变量day依次取值表中各字符串,即第一次将“Monday”赋给day,然后进入循环体,执行其 中的命令,显示出Monday。第二次将“Wednesday”赋给day,然后执行循环体中命令,显示出Wednesday 。依次处理,当 day把值表中各字符串都取过一次之后,下面day的值就变为空串,从而结束for循环。因此, 值表中字符串的个数就决定了for循环执行的次数。在格式上,值表中各字符串之间以空格隔开。 格式二: for 变量 in 文件正则表达式 do 命令表 done 其执行过程是,变量的值依次取当前目录下(或给定目录下)与正则表达式相匹配的文件名,每取值一次,就 进入循环体执行命令表,直至所有匹配的文件名取完为止,退出for循环。 格式三: for i in $* 或者 for i do do 命令表 命令表 done done 这两种形式是等价的。其执行过程是,变量i 依次取位置参数的值,然后执行循环体中的命令表,直至所有位 置参数取完为止。 博客:http://www.linux286.com/6/12/?3 36/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 7.break命令和continue 命令 发布时间 :2006-11-20 21:11:40 break命令可以使我们从循环体中退出来。其语法格式是: break [ n ] 其中,n表示要跳出几层循环。默认值是1,表示只跳出一层循环。 continue命令跳过循环体中在它之后的语句,回到本层循环的开头,进行下一次循环。其语法格式是: continue [ n ] 其中,n表示从包含continue语句的最内层循环体向外跳到第几层循环。默认值为1。循环层数是由内向外编号 。 博客:http://www.linux286.com/6/12/?3 37/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 函数 发布时间 :2006-11-20 21:12:04 在Shell脚本中可以定义并使用函数。其定义格式为: [function]函数名( ) { 命令表 } 其中,关键字function可以缺省。 函数应先定义,后使用。调用函数时,直接利用函数名,如showfile,不必带圆括号,就像一般命令那样使用 。Shell脚本与函数间的参数传递可利用位置参数和变量直接传递。变量的值可以由Shell脚本传递给被调用的函 数,而函数中所用的位置参数$1、$2,等对应于函数调用语句中的实参,这一点是与普通命令不同的。下面是 使用函数的示例: #func is a function name # it echos the values of variables and arguments func( ) { echo "Let's begin now. " echo $a $b $c echo $1 $2 $3 echo "The end. " } a=" Working directory " b="is" c=`pwd` func Welcome You Byby echo "Today is ` date ` " Shell中的函数把若干命令集合在一起,通过一个函数名加以调用。如果需要,还可被多次调用。执行函数并不 创建新的进程,是通过Shell进程执行。 通常,函数中的最后一个命令执行之后,就退出被调函数。也可利用return命令立即退出函数,其语法格式是 : return [ n ] 其中,n值是退出函数时的退出值(退出状态),即$?的值。当n值缺省时,则退出值是最后一个命令执行后的 退回值。 博客:http://www.linux286.com/6/12/?3 38/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 结语 发布时间 :2006-11-20 21:12:23 本讲介绍了有关Shell编程的知识和示例,从中可以体会到bash的特点和长处。很显然,对于系统管理员来说, 利用bash编写脚本解决问题,可以大大减轻工作强度,有效提高编程效率。建议读者多上机练习。 博客:http://www.linux286.com/6/12/?3 39/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 海量 Linux 技术文章 发布时间 :2006-11-15 11:32:55 下面是linux技术文章快速入口。需要联网: Linux 技术交流 http://www.linuxdiyf.com/bbs/forum-3-1.html Linux 应用 http://www.linuxdiyf.com/bbs/forumdisplay.php?fid=3&filter=type&typeid=1 Linux 安装及学习指导 http://www.linuxdiyf.com/bbs/forum-45-1.html Linux 系统安装 http://www.linuxdiyf.com/bbs/forumdisplay.php?fid=45&filter=type&typeid=11 Linux 学习指导 http://www.linuxdiyf.com/bbs/forumdisplay.php?fid=45&filter=type&typeid=12 Linux 软件安装 http://www.linuxdiyf.com/bbs/forumdisplay.php?fid=45&filter=type&typeid=13 shell http://www.linuxdiyf.com/bbs/forumdisplay.php?fid=3&filter=type&typeid=3 Linux 壁纸 http://www.linuxdiyf.com/bbs/forumdisplay.php?fid=3&filter=type&typeid=4 红旗 http://www.linuxdiyf.com/bbs/forumdisplay.php?fid=3&filter=type&typeid=5 Redhat http://www.linuxdiyf.com/bbs/forumdisplay.php?fid=3&filter=type&typeid=6 SuSE http://www.linuxdiyf.com/bbs/forumdisplay.php?fid=3&filter=type&typeid=7 博客:http://www.linux286.com/6/12/?3 40/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 Linux 认证 http://www.linuxdiyf.com/bbs/forumdisplay.php?fid=3&filter=type&typeid=9 Linux下载分享{酷件、书籍、视频分享 } http://www.linuxdiyf.com/bbs/forum-6-1.html 服务器应用 http://www.linuxdiyf.com/bbs/forum-7-1.html 数据库应用 http://www.linuxdiyf.com/bbs/forum-8-1.html Linux 编程与内核 http://www.linuxdiyf.com/bbs/forum-9-1.html UniX 技术文章 http://www.linuxdiyf.com/bbs/forum-32-1.html Linux 业界声音、新闻 http://www.linuxdiyf.com/bbs/forum-11-1.html Linux 人才招聘信息 http://www.linuxdiyf.com/bbs/forum-46-1.html 博客:http://www.linux286.com/6/12/?3 41/42 制作于:2006-11-20 Powered by X-Space红联的个人空间 在Linux世界驰骋系列 作者:红联 制作:红联Linux论坛 祝您阅读愉快! 网络转载-作者:孟庆昌 来源:赛迪技术天地-开放系统世界 感谢原创作者,衷心感谢! 博客:http://www.linux286.com/6/12/?3 42/42 制作于:2006-11-20 Powered by X-Space
还剩41页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

pavel

贡献于2017-05-22

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf