Skip to content
hanyong edited this page Jan 7, 2018 · 4 revisions

各种开发技巧

getopt

命令行参数分为:

  • 选项参数,以 - 开头。
  • 非选项参数,不以 - 开头,或者出现在特殊参数 -- 之后。

getopt 对命令行参数进行标准化解析,结果使用 shell 标准化表示:

  • 短选项拆分,选项与选项参数拆分。
  • 未输入的可选参数表示为空字符串。
  • 使用特殊参数 -- 分割选项参数与非选项参数,即使没有参数。

典型用法如下:

getopt [options] -o|--options optstring [options] [--] parameters
  • -o 指定短选项,-l 指定长选项。
  • 选项后跟一个冒号 : 表示该选项必须设置一个参数,跟两个冒号 :: 表示可选参数。原始输入中,可选参数必须跟选项连在一起,作为一个参数。
  • 要解析的参数列表作为 getopt 的非选项参数,出现在特殊参数 --(可选)之后。

代码示例:

TEMP="$(getopt -o x -- "${@}")"
eval set -- "${TEMP}"
while true ; do
	case "${1}" in
	-x)
		# ... ...
		shift
		;;
	--)
		shift
		break
		;;
	esac
done

同时 getopt 支持简洁用法,options 可省略,短选项字符串为第一个非选项参数:

getopt [options] [--] optstring parameters

无 options 并且短选项字符串不以 - 开头,则开启兼容模式,用法如下:

getopt optstring parameters

兼容模式(与设置环境变量 GETOPT_COMPATIBLE 相同)忽略短选项中的扫描模式(+-)标记。

短选项字符串可添加扫描模式标记前缀:

  • +,与设置环境变量 POSIXLY_CORRECT 相同,遇到第一个非选项参数后即停止解析。 这对支持子命令非常有用,第一个非选项参数即子命令,后续参数由子命令解析和处理。

$ getopt -- '+xyz' -xz ok -xy -x -z -- 'ok' '-xy' ```

  • -,保持非选项参数的位置,不会移动到特殊参数 -- 之后,但最后依然会输出特殊参数 --

$ getopt -- '-xyz' -xz ok -xy -x -z 'ok' -x -y -- ```

特殊用法: 非兼容模式会将参数用 shell 转义表示,使用这个特性可将任意参数作为 待解析的非选项参数 输入,得到 shell 转义表示。 同时作为副作用,会添加特殊参数 -- 前缀。 这里短选项字符串不重要(未使用),可设置为空(或任意值)。

$ getopt -- '' -- -xy
 -- '-xy'

简洁用法可直接使用短选项字符串,同时必须以 - 开头避免开启兼容模式,同时又不能是 getopt 选项, 作为特殊用法可使用单独的 - 字符作为选项字符串:

$ getopt - -- -xy
 -- '-xy'

可使用 tail -c +5 过滤掉特殊参数 -- 前缀。

Clone this wiki locally