我一直想知道如何为我的Bash脚本创建命令行参数。经过搜索,我找到了2个函数可以处理这个问题,getopt函数和getopts函数。我无意争论哪个功能更好。getopts是一个shell内置命令,实现这个功能似乎比getopt更容易,所以这篇文章我要讲的是getopts。当bashgetopts启动时,我只尝试处理传递给脚本的命令行参数。***,我添加了一些其他有用的功能,使该脚本成为任何其他处理命令行的交互式脚本的起始模板。我还在纯文本中添加了一个辅助函数,使脚本更易于阅读。与其用长篇大论来解释getopts如何在bash中工作,我认为拥有一个工作脚本会更容易。#!/bin/bash#######################################################################这是一个在Bash中使用getopts的例子。它还包含一些我认为有用的#other代码。#Author:Linerd#Website:http://tuxtweaks.com/#Copyright2014#License:CreativeCommonsAttribution-ShareAlike4.0#http://creativecommons.org/licenses/by-sa/4.0/legalcode#######################################################################设置脚本名称变量SCRIPT=`basename${BASH_SOURCE[0]}`#初始化变量为默认值.OPT_A=AOPT_B=BOPT_C=COPT_D=D#设置Help字体`tputsmso`#HelpfunctionfunctionHELP{echo-e\\n"${BOLD}${SCRIPT}.${NORM}的帮助文档"\\necho-e"${REV}基本用法:${NORM}${BOLD}$SCRIPTfile.ext${NORM}"\\necho"命令行开关是可选的。识别以下开关。"echo"${REV}-a${NORM}--设置v选项${BOLD}a${NORM}的值。默认为${BOLD}A${NORM}。"echo"${REV}-b${NORM}--设置选项${BOLD}b${NORM}的值。默认为${BOLD}B${NORM}。"echo"${REV}-c${NORM}--设置选项${BOLD}c${NORM}的值。默认为${BOLD}C${NORM}。"echo"${REV}-d${NORM}--设置选项${BOLD}d${NORM}的值。默认为${BOLD}D${NORM}。"echo-e"${REV}-h${NORM}--显示此帮助信息。不执行进一步的功能。"\\necho-e"示例:${BOLD}$SCRIPT-afoo-bman-cchu-dbarfile.ext${NORM}"\\nexit1}#检查数字的参数。如果没有传递,打印帮助并退出。NUMARGS=$#echo-e\\n"Numberofarguments:$NUMARGS"if[$NUMARGS-eq0];thenHELPfi###Startgetoptscode####Parsecommandlineflags#如果option需要跟参数,在option后面加":"#注意"-h"选项没有":",因为他不需要参数的首字母":"optionstring用于去除getopts本身的错误,同时获取无法识别的选项。(注解:如果选项字符串不以“:”开头,则getopts会在出错时(非法选项或缺少参数)向错误输出打印错误信息;如果以“:”开头,则不会打印[在mancalledsilenterrorreporting]中,并将错误的选项分配给OPTARG变量)whilegetopts:a:b:c:d:hFLAG;docase$FLAGina)#setoption"a"OPT_A=$OPTARGecho"-aused:$OPTARG"echo"OPT_A=$OPT_A";;b)#setoption"b"OPT_B=$OPTARGecho"-b使用:$OPTARG"echo"OPT_B=$OPT_B";;c)#setoption"c"OPT_C=$OPTARGecho"-c使用:$OPTARG"echo"OPT_C=$OPT_C";;d)#setoption"d"OPT_D=$OPTARGecho"-dused:$OPTARG"echo"OPT_D=$OPT_D";;h)#showhelpHELP;;\?)#unrecognizedoption-showhelpecho-e\\n"Option-${BOLD}$OPTARG${NORM}notallowed."HELP#这里如果不想打印完整的帮助信息,只想显示简单的错误信息,去掉上面两行,同时使用下面两行。#echo-e"Use${BOLD}$SCRIPT-h${NORM}查看帮助文档。"\\n#exit2;;esacdoneshift$((OPTIND-1))#This告诉getopts继续###结束getopts代码######处理文件的主循环####在这里你可以用你的脚本处理逻辑替换它。此示例仅在终端中打印文件的文件名和扩展名。您可以将任何其他文件处理任务放入此while-do循环中。而[$#-ne0];doFILE=$1TEMPFILE=`basename$FILE`#TEMPFILE="${FILE##*/}"#另一种获取无后缀文件名的方法。FILE_BASE=`echo"${TEMPFILE%.*}"`#filewithoutextensionFILE_EXT="${TEMPFILE##*.}"#fileextensionecho-e\\n"Inputfileis:$FILE"echo"Filewithoutextensionis:$FILE_BASE"echo-e"Fileextensionis:$FILE_EXT"\\nshift#Moveontonextinputfile.done###Endmainloop###exit0将上面的代码复制到你的文本编辑器,然后将其保存到您的可执行路径。我将此脚本命名为options并将其保存到/home/linerd/bin路径。请记住在保存后为您的脚本添加可执行权限。chmod+x~/bin/options现在脚本可以运行了。尝试使用-h参数打印帮助信息。options-h遇到不支持的选项,脚本也可以给出提示并打印帮助信息。options-z***,getopts可以按任意顺序处理你给出的命令行参数。唯一的限制是你要处理的文件必须放在所有参数的最前面。options-dbar-cchu-bman-afooexample1.txtexample2.txt现在你可以从这些例子中看到如何通过命令行参数给脚本中的变量赋值。除了getopts之外,该脚本中还有许多其他内容,但我认为这些足以作为新脚本的起始模板。如果您有兴趣了解有关bash的getopts的更多信息,您可以在手册页的“内置”部分中找到隐藏的文档,或者您可以从Bash参考手册中找到信息。下一步是什么?你将使用getops做什么?在评论中让我知道。via:http://tuxtweaks.com/2014/05/bash-getopts/译者:CNprober
