首页 > 代码库 > getopts简易教程(Small getopts tutorial)译文(未完成)
getopts简易教程(Small getopts tutorial)译文(未完成)
getopts简易教程
当你想用一种专业的方式解析命令行参数时,getopts就是要选择的工具。和它的旧版本兄弟命令getopt不同(注意没有s!),getopts是shell内置命令。高级地方表现在
- 你不需要通过一个外部命令传递参数
- getopts可以很容易的设置一些你能用于解析参数的变量(对于一个外部程序来说这是不可能的!)
- 你不必再处理过去一些使用getopt时的一些bug实现(空格, …)
- getopts已经在POSIX?定义
一些其他解析位置参数的其他方法(不用getopt(s))在这里介绍了: 如何处理位置参数.
注意getopts不能解析GNU风格的长选项(–myoption)或XF86风格的长参数(-myoption)!
介绍
术语
需要先了解一下我们这里探讨的事情,所以让我们来看一个范例… 来看一下下面这行命令:
mybackup -x -f /etc/mybackup.conf -r ./foo.txt ./bar.txt
所有这些都叫位置参数,但是你可以把他们分成一些逻辑组:
- -x是一个选项, 一个标识, 一个开关: 一个字符, 有一个前引导短横杠(-)
- -f也是一个选项,但是这个选项有一个额外参数(传递给-f选项的参数): /etc/mybackup.conf。这个参数通常与它的参数分开(使用一个空格或其他分隔符), 但这不是必须的, -f/etc/mybackup.conf也是合法的。
- -r依赖于配置。在这个范例中,-r不需要参数,所以它是独立的选项,像-x
- ./foo.txt和./bar.txt是剩余的参数,不与任何选项关联。这些通常用作聚合参数(比如你指定给cp(1)的文件名)或者不需要选项的参数,因为这是程序的预定义格式(就像你传递给文本编辑器的文件名参数,用于打开和显示文本 - 为何还需要一个额外的开关呢?). POSIX?调用它们作为操作对象
让你体会一下为什么getopts很有用: 上面的命令可以像这样读取…
mybackup -xrf /etc/mybackup.conf ./foo.txt ./bar.txt
…使用自己的代码去解析很困难。而getopts可以认出所有常见的选项格式。
选项标识可以有大小写,也可以是数字。甚至是其他可识别字符,但是并不推荐这么做(可用性差而且特殊字符可能会出问题)。
原理
一般你需要调用getopts好几次。每次会使用"下一个"位置参数(和一个可能的内容摘要),如果解析成功,会给你返回结果。getopts不会改变位置参数的设定 —— 如果你想要shift掉参数,你必须手工处理:
shift $((OPTIND-1))
# now do something with $@
因为getopts在没有要解析的参数剩余时会返回退出状态FALSE,所以可以很容易的在while循环使用:
while getopts ...; do
...
done
getopts将会解析选项和他们可能的参数。遇到第一个非选项的参数时将会停止解析(一个不以连字符(-)开头的字符串,这不是前面任何一个选项的参数)。同样也会在看到–(双连字符)时停止解析,因为这个含义是选项终止。
有用的变量
(oschina的markdown不支持表格?那就凑或着看吧)
|变量|描述|
|——–|——–|
|OPTIND|保存下一个要解析的参数的指针。这就是getopts如何"记住"自己的状态和回调请求。同样可以用于在getopts处理过之后shift掉位置参数。OPTIND初始为1, 如果你想要再次使用getopts解析任何参数时需要重新设置为1|
|OPTARG|这个变量设置为被getopts发现的选项的参数。同样包含了未知的选项标记|
|OPTERR|(Values 0 or 1) Indicates if Bash should display error messages generated by the getopts builtin. The value is initialized to 1 on every shell startup - so be sure to always set it to 0 if you don‘t want to see annoying messages!|
getopts also uses these variables for error reporting (they‘re set to value-combinations which arent possible in normal operation).
getopts简易教程(Small getopts tutorial)译文(未完成)