NAME

   getopt - 解析命令行选项(加强版)

SYNOPSIS

       getopt optstring parameters
getopt [options] [--] optstring parameters
getopt [options] -o|--options optstring [options] [--] parameters

(译注:

  1. 后面的译文中将分别称呼这3种语法格式为语法1、语法2、语法3
  2. 请区分option、parameter、argument、option argument、non-option parameter。如不清楚,请参考:https://www.cnblogs.com/f-ck-need-u/p/9758075.html

    )

DESCRIPTION

getopt用于拆分(解析)命令行中的选项,以便能被shell程`如shell脚本)轻松解析,也用来检查选项是否合理。该命令使用的是GNU getopt(3)程序实现的。

getopt的参数分为两部分:用于修改getopt解析模式的选项(即语法中的options和-o|--options optstring)和待解析的参数(即语法中的parameters部分)。第二部分将从第一个非选项参数开始,或者从"--"之后的第一项内容开始。如果在第一部分中没有给定"-o|--options",则第二部分的第一个参数将用作短选项字符串。

如果设置了环境变量GETOPT_COMPATIBLE,或者它的第一个参数不是一个选项(即未使用"-"开头的字符串,即语法1),getopt将生成与其它getopt(1)兼容的输出。它仍然会对参数进行调整,也会识别可选参数(见下面的COMPATIBILITY部分)。

传统的getopt(1)无法拷贝空白字符以及其它特殊字符(特指shell的特殊字符)。要解决该问题,getopt可以生成引号保护的输出,然后再用shell去解释(通常使用eval命令),这样可以保护这些特殊字符,但前提是不能使用兼容版本的getopt(即语法2和语法3可以解决该问题)。要判断所安装的getopt是否是加强版的getopt,只需使用特殊选项"-T"进行测试即可。

OPTIONS

-a, --alternative

允许长选项(long options)用单个短横线"-"开头。(即单个短横线开头的选项也会被认为是长选项)

-h, --help

输出getopt的用法帮助信息。

-l, --longoptions longopts

识别长选项(多个字符的选项)。longopts可以一次性指定多个选项名称,只需使用逗号分隔即可。该选项可以多次使用,longopts会进行累积。在longopts中,每个长选项名称后面都可以跟一个冒号,表示该选项需要一个参数,也可以跟两个冒号,表示该选项的参数是可选的。

-n, --name progname

当getopt(3)报告错误时,getopt(3)将使用该名称。注意,getopt(1)的错误仍然被报告为来自getopt。

-o, --options shortopts

识别短选项(单个字符的选项)。如果没有给定该选项,getopt的第一个未使用"-"开头的参数(且不是option argument)将被用于短选项字符串。shortopts中的每个短选项字符后面都可以跟一个冒号,表示该选项需要一个参数,也可以跟两个冒号,表示该选项的参数是可以选的。shortopts的第一个字符可以设置"+"或"-"来影响选项的解析方式和输出方式(详细内容见下面的SCANNING MODES)。

-q, --quiet

禁止getopt(3)输出的报错信息。

-Q, --quiet-output

禁止普通的输出。但仍然会输出getopt(3)产生的错误信息,除非同时指定了"-q"选项。

-s, --shell shell

指定使用哪种shell的引号解析方式。如果未使用-s选项,则使用BASH。其它支持的shell类型包括:sh、bash、csh和tcsh。

-u, --unquoted

不要使用引号包围输出。注意,禁止引号保护后,空白字符和shell特殊字符将被破坏(就像其它版本的getopt(1)一样)。

-T, --test

测试使用的getopt(1)是加强版的还是传统旧版的。加强版的getopt没有任何输出,且退出状态码为4。其它版本的getopt(1)或者加强版的getopt设置了GETOPT_COMPATIBLE环境变量,则输出"--",且退出状态码为0。

-V, --version

输出getopt的版本号并退出。

PARSING

本节指定getopt参数的第二部分的格式。下一节(OUTPUT)描述生成的输出。这些参数通常是shell函数调用的参数。必须注意的是,调用shell函数时的每个参数都恰好对应getopt参数列表中的一个参数(请参阅EXAMPLES)。所有的解析行为都由GNU getopt(3)完成。

参数解析的方式是从左向右解析。每个参数都被分类为短选项、长选项、选项参数(option argument)和非选项类型的参数(non-option parameter)其中的一种。

一个简单的短选项是使用"-"跟一个短选项字符。如果选项需要一个参数,这个选项参数可以直接写在选项字符的后面(译注:例如-n3),或者作为下一个parameter(例如,在命令中使用空白分隔(译注:例如-n 3))。如果选项的参数是可选的,当需要解析给定的选项参数时,参数必须直接写在选项字符后面(译注:即不能用空白分隔选项和它的参数)。

可以在单个短横线后面跟多个短选项字符(译注:例如tar -zcf的zcf都在单个"-"后面),只要它们不需要参数(允许最后一个给参数)即可(译注,参考tar -zcf a.tar.gz的格式)。

长选项一般使用"--"开头,后面跟长选项的名称。如果长选项需要参数,可以使用"="连接长选项和它的参数,或者将参数作为长选项的下一个parameter(译注,例如两种形式:--file=FILE--file FILE)。如果长选项的参数是可选的,必须使用"="连接长选项和它的参数值。长选项可以进行缩写,只要不会产生歧义即可。

如果一个parameter不是使用"-"开头,也不是它前面的选项所需的参数,那么它就是一个非选项类型的参数(non-option parameter)。每个跟在"--"长选项后的parameter总是被解析为非选项类型的参数(non-option parameter)。如果设置了环境变量POSIXLY_CORRECT,或者如果短选项字符使用"+"开头,所有剩余的参数被解析为非选项类型的参数(non-option parameter)。

OUTPUT

OUTPUT是前一小节所描述的每个元素生成的。output输出的顺序和input给定的顺序是一致的,但非选项类型的参数(non-option parameter)除外。可以使用兼容模式(不使用引号保护)处理output,也可以使用引号包围的模式处理output,这样空白字符、argument中的特殊字符以及非选项类型的参数都可以被原样保留(见下面的QUOTING)。在shell脚本中处理output时,一般来说,各个元素可以一个一个地被处理(大多数shell语言中可以使用shift命令实现),但这种模式是有缺陷的,非引号保护模式下,如果有特殊字符,各个元素可能会被切割在预料之外的位置。

如果解析parameter时出现了问题,例如需要的argument没有找到,或者无法识别某个选项,将向stderr中报告错误,且产生错误的那个选项将不会有任何output,并返回一个非0状态码。

对于短选项,将生成一个由"-"和一个选项字符组成的parameter。如果选项有选项参数(argument),下一个parameter将被作为该选项的argument。如果选项有一个可选参数,但没找到这个参数,此时,如果在引号保护模式下,将生成一个使用引号包围的空参数作为下一个参数,如果在兼容模式(非引号保护)下,则不会生成下一个参数。注意,许多其它版本的getopt(1)不支持可选参数。

(译注:例如"-a"选项,将生成-a作为一个parameter,如果它有选项参数,则生成-a ARG共两个parameter,如果选项参数可选,在引号保护模式下,生成"-a" ""共两个parameter,在非引号保护模式下,将只有-a一个parameter)

如果单个横线"-"后面一次性跟了多个短选项字符,将会分隔它们为独立的parameter。(译注,如"-avz"将生成-a -v -z共3个parameter)。

对于长选项,将生成一个由"--"和完整的长选项名组成的parameter。只要它是长选项,无论它是缩写形式的,还是使用单个短横线"-"指定的,生成parameter时都会补齐。此外,长选项的参数处理方式和短选项处理方式一样。

一般来说,在处理完所有option和它们的argument之前,不会生成非选项类型的参数(non-option parameter)的output。在处理非选项类型参数时,首先会生成一个"--"作为一个独立的parameter,然后各个非选项类型的参数(non-option parameter)将按照顺序生成各自的output,每个都是单独的parameter。只有当短选项字符的第一个字符是"-"时,才会在它们被发现的位置处生成该非选项类型的参数(non-option parameter)的Output(如果使用语法1,将不支持该功能。此时,所有前缀的"-"和"+"都会被忽略)。

QUOTING

在兼容模式下,空白字符、argument或非选项类型的参数(non-option parameter)中的特殊字符将不会被正确处理。因为output是提供给shell脚本的,脚本并不知道如何将这个output拆分成不同的parameter。要避免该问题,可以使用加强版getopt提供的QUOTING功能,它会使用引号保护这些parameter,当这些output再次提供给shell时(一般会用eval命令来解析),将能正确地被拆分成独立的parameter。

如果设置了GETOPT_COMPATIBLE环境变量,或者使用了语法1,或者使用了"-u"选项,将禁用QUOTING功能。

不同的shell使用不同的引号处理规则。可以使用"-s"选项指定你想使用的shell。目前支持的shell类型有:sh、bash、csh和tcsh。事实上,只有两种风格的区别:类sh(sh-like)的引号处理风格和类csh(csh-like)的引号处理风格。即使你使用其它类型的shell,也仍然可以指定这几种shell。

SCANNING MODES

短选项的第一个字符可以使用"+"或"-"开头来指定一种扫描模式。如果使用语法1,这两个特殊符号将被忽略,但如果设置了环境变量POSIXLY_CORRECT,则仍然会执行扫描。

如果第一个字符为"+",或者设置了环境变量POSIXLY_CORRECT,只要发现了第一个非选项类型的参数(non-option parameter)就会停止解析(例如,parameter未使用"-"开头),而且它后面的所有参数都会被解释为非选项类型的参数(non-option parameter)。

如果第一个字符为"-",非选项类型的参数(non-option parameter)的output将根据它所在的位置进行生成。而默认情况下,它们是被收集到一个独立的"--"参数之后的。在这种扫描模式下,其实也会生成"--"参数,只不过生成在所有parameter的最尾部。

翻译:man getopt(1)中文手册的更多相关文章

  1. man rsync翻译(rsync命令中文手册)

    本文为命令rsync的man文档翻译,几乎所有的选项都翻译了,另外关于筛选规则部分只翻译了一部分.由于原文很多地方都比较啰嗦,所以译文中有些内容可能容易让国人疑惑,所以我个人在某些地方加上了注释.若有 ...

  2. Zepto,Zepto API 中文版,Zepto 中文手册,Zepto API,Zepto API 中文版,Zepto 中文手册,Zepto API 1.0, Zepto API 1.0 中文版,Zepto 1.0 中文手册,Zepto 1.0 API-translate by yaotaiyang

    Zepto,Zepto API 中文版,Zepto 中文手册,Zepto API,Zepto API 中文版,Zepto 中文手册,Zepto API 1.0, Zepto API 1.0 中文版,Z ...

  3. man rpcbind(rpcbind中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html RPCBIND() BSD System Manager's Manual RPCBI ...

  4. man nfsd(rpc.nfsd中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html rpc.nfsd() System Manager's Manual rpc.nfsd ...

  5. man mountd(rpc.mountd中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html rpc.mountd() System Manager's Manual rpc.mo ...

  6. man statd(rpc.statd中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html rpc.statd程序主要实现NFS锁相关内容,如普通的文件锁(NLM.NSM).文件 ...

  7. man sm-notify(sm-notify命令中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html sm-notify命令是用来发送重启通知信息给NFS对端的,在锁状态恢复过程中起着至关 ...

  8. man exportfs(exportfs命令中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html exportfs() System Manager's Manual exportfs ...

  9. Swift3 中文手册.CHM版

    根据官方翻译制作Swift3 中文手册.CHM版已完成. Swift3 中文手册.CHM版下载地址

随机推荐

  1. 1003 Emergency Dijkstra

    这题做的心很累,我用的还是 1018的思路做的,但是 使用dfs 求最大人数对于某些有问题(现在也不知道错哪了), 看了别人的代码后才发现,其实完全不用这么麻烦,只需设置一个点的权重,一遍DJ(自创简 ...

  2. LAPM 相关实验01

    目录 lab1 静态.动态资源的区别lab2 部署phpMyadminlab3 部署wordpresslab4 编译安装php-Xcache加速器lab5 fcgi实现lamp lab1 静态.动态资 ...

  3. Paper | 深度网络中特征的可迁移性

    目录 1. 核心贡献 2. 实验设置 2.1. 任务设置 2.2. 网络设置 3. 实验结果 4. 启发 论文:How transferable are features in deep neural ...

  4. 利用python list 完成最简单的DB连接池

    先来看查看效果: 在代码连接数据库后,并且执行三条sql后,将mysql直接重启掉,故我们的连接池连接均是不ok的,所以,它会全部删除再抓新的连接下来,重启mysql命令: 关于python代码: # ...

  5. 用mplayer从视频中按周期提取帧

    使用方法:extract file time step folder time 设置时间长度 step 设置周期 均以秒(s)为单位 贡献:1. 从视频文件中周期性提取图片:2. Windows下批处 ...

  6. 携带cookie的跨域访问

    携带cookie的跨域解决方案 有的时候访问后台的请求需要携带cookie以供后台分析,比如jQuery的ajax请求: $.ajax({ url: a_cross_domain_url, xhrFi ...

  7. Django积木块五——分页

    分页 django本身带有分页功能,为什么要用他呢?因为它的代码更为简洁,并且在做筛选的时候会把url中的所有参数都组装起来,并且加上分页.也就是做筛选中的结果也可以用这个分页. pip instal ...

  8. html、css基础整理

    1.块元素与行内元素之间的转换: HTML可以将元素分类方式分为行内元素.块状元素和行内块状元素三种.这三者是可以互相转换的,使用display属性能够将三者任意转换: (1)display:inli ...

  9. JAVA的 IO NIO AIO笔记

        IO      linux内核将所有外部设备都看做一个文件来操作,对一个文件的读写会调用内核系统命令,放回一个file descriptor(文件描述符), 对一个socket的读写也会有相应 ...

  10. poj 1050 最大子矩阵

    a11   a12   a13   a14   a15 a21   a22   a23   a24   a25 a31   a32   a33   a34   a35 a41   a42   a43  ...