Linux Shell命令行及脚本编程实例详解课件:第10章 脚本输入处理_第1页
Linux Shell命令行及脚本编程实例详解课件:第10章 脚本输入处理_第2页
Linux Shell命令行及脚本编程实例详解课件:第10章 脚本输入处理_第3页
Linux Shell命令行及脚本编程实例详解课件:第10章 脚本输入处理_第4页
Linux Shell命令行及脚本编程实例详解课件:第10章 脚本输入处理_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

第10章

脚本输入处理10.1参数处理10.1.1实例:使用case语句处理命令行参数当我们的脚本只接收一个命令行参数,并且会根据这个命令行参数的不同采取不同行为时,我们通常会使用case语句来处理这个命令行参数。这种方法最常见于Linux下的应用程序或服务的启动脚本中。10.1.2实例:使用shift命令处理命令行参数如果我们的脚本只有一个命令行参数时,使用case语句是很方便的。但如果我们的脚本需要多个命令行参数时,使用case语句看上去就不太合理了。对于这种情况,我们就可以使用shift命令在一个变量中一个接一个地获取多个命令行参数。首先,我们来了解一下关于shift命令的一些信息。shift是bash的一个内部命令。此命令用于将传递的参数变量向左移。shift命令的语法如下所示:shift[n]n必须是一个小于或等于“$#”的非负整数。如果n为0,位置参数将不会改变。如果没有指定n,那么它将被默认设为1。如果n大于$#,位置参数同样不会改变。如果n大于$#或小于0,此命令的返回状态码将大于0,否则为0。10.1.3实例:使用for循环读取多个参数若传递给脚本的参数只有一两个,我们可以简单地使用特殊变量$1、$2来获取传递给脚本的命令行参数。但如果命令行参数较多时,在脚本中逐条编写语句对每个位置参数进行处理显然是费时且乏味的,这时我们当然可以使用上一节讲述的while循环结合shift命令来处理每个命令行参数。在这里我们还有一个较常用的方法,即使用for循环来一个接一个地处理所有命令行参数。10.1.4实例:读取脚本名在编写Shell脚本时,我们为了使脚本更加严谨,较少脚本运行时可能产生的异常错误。在脚本中的开头部分,我们一般都会编写一段对与脚本相关的环境或变量进行检查的代码。比如,会检查指定给脚本的命令行参数的个数,如果参数的个数不符合脚本的定义,我们会打印一条关于脚本的命令行参数使用方法的信息到标准输出并退出脚本的执行,这个时候我们一般就会需要读取脚本的名称来显示使用方法的信息。10.1.5实例:测试命令行参数为了使我们脚本更严谨,防止运行中由于参数错误产生的异常,我们通常除了检查命令行参数的个数外,有时还会检查参数的值,若指定的参数是文件或目录,我们还会检查它是否存在,或是否为可执行等等。10.2选项处理在前面一节中我们已经学习了在Shell脚本中如何对命令行参数进行处理,不知你是否注意到了这里面存在的一个缺陷。那就是如果Shell脚本需要多个命令行参数时,那么我们调用这个脚本时所指定的命令行参数的顺序必须是固定的。如果指定的命令行参数的顺序不对,即使参数的个数符合要求,脚本也不能正常运行。比如,有一个脚本process.sh,它可以接收三个命令行参数,它们分别是:脚本的默认配置文件、包含输入数据的文件和脚本的输出文件。例如,此脚本可以使用如下命令行参数调用:$process.shdefaults.confinput.txtoutput.txt此脚本将读取配置文件defaults.conf的内容,处理input.txt文件,然后将输出写入到output.txt文件。现在我们来看一下,如果我们在不知道这三个命令行参数分别代指哪个文件的情况下,调用此脚本会发生什么。比如,我们使用如下命令行参数调用了脚本process.sh:$process.shoutput.txtdefaults.confinput.txt现在脚本process.sh将读取output.txt文件的内容来作为配置文件的内容,并且会将本该作为输入文件的input.txt文件的内容重写覆盖掉。因此,为了避免类似于上述这种情况,也为了使我们的脚本更严谨,或者当我们编写一个功能较为复杂的脚本时,我们通常让脚本具有可以指定选项的功能。就像Linux下的许多命令行工具一样,我们调用它们时,可以在命令后面指定不同的选项及命令行参数。比如,对于脚本process.sh,如果有一个更好的实现,我们可以使用“-c”选项表示指定一个配置文件,使用“-o”选项表示指定一个输出文件。它的更好的实现将类似于如下所示:$process.sh-cdefaults.conf-ooutput.txtinput.txt10.2.1实例:使用case语句处理命令行选项当我们编写的Shell脚本只接收一个命令行选项时,使用case语句对其进行处理还是比较方便的。比如,有一个脚本processFile.sh,你可以指定不同的选项来调用其不同的功能,但调用此脚本时只能同时指定一个命令行选项和参数。10.2.2实例:使用getopts处理多命令行选项当你希望以专业的方式解析命令行选项和参数时,getopts将是一个很好的工具。它是Bash的内部命令。它的优势在于:你不需要通过一个外部程序来处理你的位置参数。getopts可以很容易地设置你可以用来解析的Shell变量(对于一个外部进程是不可能的)。getopts定义在POSIX中。注意:getopts不能解析GNU风格的长选项(--myoption)或XF86风格的长选项(-myoptions)!。10.2.3实例:使用getopt处理多命令行选项getopt命令与getopts的功能很相似,也是用于解析命令行的选项和参数,使其可以被Shell程序简单地解析。不同的是,getopt命令是linux下的命令行工具,并且getopt支持命令行的长选项(比如,--some-option)。另外,在脚本中它们的调用方式也不同。getopt命令的语法类似如下所示:getopt[options][--]optstringparametersgetopt[options]-o|--optionsoptstring[options][--]parameters10.3获得用户输入10.3.1实例:基本的读取read命令比较常用的语法格式如下所示:read[-pprompt][variable1variable2…]-p选项用于在尝试读取任何输入之前,显示prompt(提示信息)的内容到标准错误输出。我们一般使用这一选项来指定提示用户输入哪些内容的信息。read命令会每次从标准输入(或使用-u选项指定的文件描述符中)读取一行的内容,它会将第一个单词赋值给第一个变量variable1,第二个单词赋值给第二个变量variable2,以此类推。如果输入的单词数少于指定的变量数,那么剩下的name变量的值会被设为空,环境变量IFS中的字符被作为分隔符来将输入的内容分隔为单词。10.3.2实例:输入超时你可以使用read命令的-t选项来设置read命令读取用户输入的超时时间。如果在指定的秒数内没有读入一整行的输入(即没有键入回车键),read命令就会超时并返回一个失败。10.3.3实例:隐藏方式读取我们可以使用read命令的-s选项来隐藏用户的输入。如果指定了-s选项,来自终端的输入不会被显示出来。这对我们的脚本在需要对用户输入的密码进行验证时是很有用的(为了安全,我们当然不会希望输入的密码明文回显在屏幕上)。10.3.4实例:从文件中读取使用read命令从文件读取数据的方法主要有两种,一种是在while循环或until循环中使用read命令通过文件描述符一行一行地读取文件的内容,这种方法我们将在第11章中将文件描述符时再做详细的介绍;另一种方法是在for循环中使用命令“cat<filename>”来读取文件中的内容。本节我们将介绍如何使用第二种方法来从文件读取数据。在for循环中使用命令“cat<filename>”读取文件的语法是:fordatain$(catfilename)docommand1command2…commandNdone上述语法中,filename代表一个文本文件,读取的内容会被存入变量data,此变量会在for循环体中使用,来对读入的数据进行处理。10.4小结下面我们总结一下本章所学的主要知识:与向函数传递命令行参数的方法类似,我们也可以使用此方法向Shell脚本传递参数。这些传递的命令行参数同样存储在位置参数($1,$2,…$9,${10},${11},…)中。特殊变量“$*”和“$@”会存储所有传递的命令行参数,特殊变量“$#”会储存传递的命令行参数的个数。当我们的脚本只接收一个命令行参数,并且会根据这个命令行参数的不同采取不同行为时,我们通常会使用case语句来处理这个命令行参数。这种方法最常见于Linux下的应用程序或服务的启动脚本中。case语句中的每个模式匹配是大小写敏感的。可以使用命令“shopt-snocasematch”开启nocasematch选项当我们的脚本需要多个命令行参数时,可以使用shift命令在一个变量中一个接一个地获取多个命令行参数。shift是bash的一个内部命令。此命令用于将传递的参数变量向左移,在每次移位之后,特殊变量$#的值也会调整。而特殊变量$0并不参与移位操作。如果我们读取特殊变量$1的值,然后运行命令shift,再次读取特殊变量$1的值,那么我们将得到特殊变量$2的值。然后再次运行命令shift,我们再读取特殊变量$1时,将得到特殊变量$3的值,以此类推。由此,只要$#的值不会0,我们就可以在while循环中进行迭代,获取特殊变量$1的值,然后运行shift命令,然后再次读取$1的值,来依次获得所有传递的命令行参数。10.4小结在编写Shell脚本时,我们为了使脚本更加严谨,较少脚本运行时可能产生的异常错误。在脚本中的开头部分,我们一般都会编写一段对与脚本相关的环境或变量进行检查的代码。当我们编写的Shell脚本只接收一个命令行选项时,可以使用case语句对其进行处理。当你希望以专业的方式解析命令行选项和参数时,getopts将是一个很好的工具。它是Bash的内部命令。它的优势在于:你不需要通过一个外部程序来处理你的位置参数;getopts可以很容易地设置你可以用来解析的Shell变量(对于一个外部进程是不可能的);getopts定义在POSIX中。getopts将解析选项和它们可能的参数。它将在第一个非选项参数(不以连字符‘-’开头的,且不是它前面的任何选项的参数的字符串)的位置停止解析。当遇到双连字符‘--’(表示选项的结束)时,它也将停止解析。getopts会使用到以下三个变量:OPTIND:存放下一个要处理的参数的索引。这是getopts在调用之间记住自己状态的方式。同样可以用于移位使用getopts处理后的位置参数。OPTIND初始被设为1,并且如果你想再次使用getopts解析任何内容,需要将其重置为1。OPTARG:这个变量被设置为由getopts找到的选项所对应的参数。10.4小结OPTERR:它的值为0或1。指示Bash是否应该显示由getopts产生的错误信息。在每个Shell启动时,它的值被初始化为1。如果你不想看烦人的信息,请确保将它设置为0。getopts命令的基本语法是:getoptsOPTSTRINGVARNAME[ARGS...]其中OPTSTRING告诉getopts会有哪些选项和在哪会有参数(用选项后加冒号‘:’表示,见下面示例);VARNAME告诉getopts哪个变量用于选项报告;ARGS告诉getopts解析这些可选的参数,而不是位置参数。getopts命令支持两种错误报告的模式,分别为:详细错误报告模式和抑制错误报告模式。在详细错误报告模式下,如果getopts遇到了一个无效的选项,VARNAME的值会被设置为问号(?),并且变量OPTARG不会被设置;如果需要的参数没找到,VARNAME的值同样会被设置为问号(?),变量OPTARG也不会被设置,并且会打印一个错误信息。在抑制错误报告模式下,如果getopts遇到了一个无效的选项,VARNAME的值会被设置为问号(?),并且变量OPTARG会被设置为选项字符;如果需要的参数没找到,VARNAME的值同样会被设置为冒号(:),并且变量OPTARG中会包含选项字符。getopt命令与getopts的功能很相似,也是用于解析命令行的选项和参数,使其可以被Shell程序简单地解析。不同的是,getopt命令是linux下的命令行工具,并且getopt支持命令行的长选项(比如,--some-option)。另外,在脚本中它们的调用方式也不同。getopt命令的“-o”选项表示告诉getopt识别哪些短(一个字符)选项,所指定的选项字符串遵循如下规则:每一个字符代表一个选项;字符后跟一个冒号(:)表示选项需要一个参数;字符后跟两个冒号(::)表示选项有个可选参数。10.4小结getopt命令的“--long”选项表示告诉getopt识别哪些长(多个字符)选项,所指定的选项字符串遵循如下规则:每个选项之间由逗号(,)分隔;字符串后跟一个冒号(:)表示选项需要一个参数;字符串后跟两个冒号(::)表示选项有个可选参数。如果你希望你的Shell脚本支持长选项,那当然你就需要使用getopt命令;如果你的Shell脚本要考虑跨平台的兼容性,或者你的脚本不需要支持长选项,那么我还是推荐你使用bash的内部命令getopts,因为它跨平台的兼容性较好而且使用起来更简单方便。在Bash下你可以通过其内部命令read接收用户来自键盘的输入,并可以将输入的内容赋值给一个变量。因此,在一个交互式的Shell脚本中我们一般使用read命令来获取用户的输入。read命令的-p选项用于在尝试读取任何输入之前,显示prompt(提示信息)的内容到标准错误输出。我们一般使用这一选项来指定提示用户输入哪些内容的信息。read命令会每次从标准输入(或使用-u选项指定的文件描述符中)读取一行的内容,它会将第一个单词赋值给第一个变量variable1,第二个单词赋值给第二个变量variable2,以此类推。如果输入的单词数少于指定的变量数,那么剩下的name变量的值会被设为空,环境变量IFS中的字符被作为分隔符来将输入的内容分隔为单词。read命令的-t选项

温馨提示

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

评论

0/150

提交评论