首页 理论教育 实用LinuxShell编程:getopts命令

实用LinuxShell编程:getopts命令

时间:2023-11-18 理论教育 版权反馈
【摘要】:使用getopts命令可以丢掉6.9.1节脚本中的shift命令。getopts检查脚本的位置参数中是否有以减号开头的字母并且该字母出现在optstring当中,若是有,这样的字母被认为是脚本中的选项,并且该选项被存入变量variable中。实际上,脚本getopts_1.sh中case命令对模式*的处理就是对不正确的选项的处理。选项字符串optstring以冒号开头时,虽然系统不提示出错,但getopts会区分不当选项和缺少参数这两种错误。综上所述,修改getopts_1.sh的几处,得到getopts_2.sh。

实用LinuxShell编程:getopts命令

使用getopts命令可以丢掉6.9.1节脚本中的shift命令。getopts命令的一般格式为:

978-7-111-48202-4-Chapter06-132.jpg

optstring是一个包括字母和冒号的字符串(字母一定有,冒号不一定有)。getopts检查脚本的位置参数中是否有以减号开头的字母并且该字母出现在optstring当中,若是有,这样的字母被认为是脚本中的选项,并且该选项被存入变量variable中。在optstring中,字母的后面有冒号时,该选项将包含参数;字母的后面没有冒号时,该选项没有参数。看下面的脚本及运行情况,再读前面这句话就清楚了。

978-7-111-48202-4-Chapter06-133.jpg

978-7-111-48202-4-Chapter06-134.jpg

当运行getopts_1.sh-a时,脚本中的getopts命令发现a出现在amnw:这个字符串当中,于是将a存入变量OPTION中;在case命令中,OPTION与a匹配,所以,显示Good afternoon:

978-7-111-48202-4-Chapter06-135.jpg

脚本getopts_1.sh比上一小节的脚本少了shift命令,而且像Linux命令一样,多个选项可以合并。运行getopts_1.sh-mn时,有两轮while循环,变量OPTION分别取值为m和n,显示两句话,效果与getopts_1.sh-m-n相同:

978-7-111-48202-4-Chapter06-136.jpg

运行getopts_1.sh-w18时,getopts命令发现w出现在amnw:这个字符串当中,并且w的后面有冒号,这表明:正常的话,-w后面有参数。内置变量OPTARG用来存放参数的值,所以,18被存入了OPTARG中。仔细读脚本,不难理解下面命令的输出结果:

978-7-111-48202-4-Chapter06-137.jpg

当输入不正确的选项时,系统将提示出错。同时,不正确的选项使得case命令中的$OPTION与*匹配,于是脚本显示了用法:

978-7-111-48202-4-Chapter06-138.jpg

978-7-111-48202-4-Chapter06-139.jpg

当输入正确的选项,但是应该带参数而没有带时,系统也提示出错:

978-7-111-48202-4-Chapter06-140.jpg

选项字符串optstring中的字母出现的次序无关紧要,脚本getopts_1.sh中的optstring为amnw:,写为aw:nm,效果不变。变次序时,要注意,w的后面有冒号,每个冒号要“紧跟”自己的字母。

如果选项字符串optstring以冒号开头,例如,将脚本中的amnw:变为:amnw:,那么,输入不当选项(illegal option)和缺乏参数(option requires an argument)时,系统将不提示出错。没有了系统错误提示的话,脚本的编写者就需要对选项和参数严格检查。实际上,脚本getopts_1.sh中case命令对模式*的处理就是对不正确的选项的处理。

选项字符串optstring以冒号开头时,虽然系统不提示出错,但getopts会区分不当选项和缺少参数这两种错误。输入不当选项时,variable被设成?,缺少参数时,variable被设成:。选项字符串optstring不以冒号开头时,getopts不区分这两种错误,遇到这两种错误时,variable都被设成?(提示,这里的variable指的是本小节一开始给出的getopts命令格式中的variable)。(www.xing528.com)

脚本getopts_1.sh中的$0在显示脚本用法时得到的是./getopts_1.sh。./表示当前目录,并不“碍事”,如果不希望出现./可以使用命令basename。

综上所述,修改getopts_1.sh的几处,得到getopts_2.sh。其中,amnw:变为:amnw:,为了表明字母出现的次序无关紧要,:amnw:又变为:aw:nm;*)变为'?'|':');$0变为$(basename$0),或者变为`basename$0`也可以。

978-7-111-48202-4-Chapter06-141.jpg

978-7-111-48202-4-Chapter06-142.jpg

输入一个错误选项-Y:

978-7-111-48202-4-Chapter06-143.jpg

输入选项-w,后面忘记带数字了:

978-7-111-48202-4-Chapter06-144.jpg

输入合并在一起的选项-na,运行正常:

978-7-111-48202-4-Chapter06-145.jpg

输入选项-w及参数20,运行正常:

978-7-111-48202-4-Chapter06-146.jpg

与getopts命令相关的还有一个内置变量OPTIND,见表4-3,它的初始值为1,在循环中,它的值为脚本的下一个参数的索引。为了理解OPTIND,看脚本getopts_3.sh,在case命令的后面增加了对变量OPTIND的值的显示命令echo"OPTIND=$OPTIND":

978-7-111-48202-4-Chapter06-147.jpg

运行getopts_3.sh-a-w30-n-m时,可以认为有6个位置参数,依次为-a、-w、30、-n、-m、无。明明是5个,为什么偏说是6个、最后一个是“无”呢?看完本小节就明白了。-a对应地输出Good afternoon,下一个为-w(第2个位置参数),所以处理完-a后OPTIND=2;-w30对应地输出This is week 30,下一个为-n(第4个位置参数),所以处理完-w 30后OPTIND=4;-n对应地输出Good night,下一个为-m(第5个位置参数),所以处理完-n后OPTIND=5;-m对应地输出Good morning,下一个为无(第6个位置参数),所以最后显示OPTIND=6:

978-7-111-48202-4-Chapter06-148.jpg

运行getopts_3.sh -anm -w 30时,可以认为有4个位置参数,依次为-anm、-w、30、无。-anm是-a -n -m的简写形式,但对shell而言,-anm是一个位置参数。-a对应地输出Good afternoon,下一个为n,它处在第1个位置参数之中,所以处理完-a后OPTIND=1;n对应地输出Good night,下一个为m,m仍处在第1个位置参数之中,所以处理完-n后OPTIND=1;m对应地输出Good morning,下一个为-w,它为第2个位置参数,所以处理完-m后OPTIND=2;-w30对应地输出This is week 30,下一个为无,它为第4个位置参数,所以最后显示OPTIND=4:

978-7-111-48202-4-Chapter06-149.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈