1、命令简介
getopt:用于解析命令行选项,检测给定的选项是否合法。
2、命令用法
getopt [options] [--] optstring parameters getopt [options] -o|--options optstring [options] [--] parameters
3、命令描述
getopt用于分解(解析)命令行中的选项,以便shell过程进行解析,并检查合法选项。
调用getopt的参数可以分为两部分:修改getopt解析方式的选项(options和-o|--options optstring在SYNOPSIS中),以及要解析的参数(SYNOPSIS中的参数)。第二部分将从不是选项参数的第一个非选项形参开始,或者在'--'第一次出现之后开始。如果在第一部分中没有找到' -o '或'--options '选项,则第二部分的第一个参数将用作短选项字符串。
如果设置了环境变量GETOPT_COMPATIBLE,或者如果它的第一个参数不是一个选项(不是以' - '开头,这是SYNOPSIS中的第一种格式),getopt将生成与getopt的其他版本兼容的输出。它仍然会进行参数变换并识别可选参数。
getopt的传统实现无法处理参数和非选项参数中的空格和其他(特定于shell的)特殊字符。为了解决这个问题,这个实现可以生成带引号的输出,shell必须再次解释该输出(通常使用eval命令)。这样可以保留这些字符,但是必须以与其他版本(SYNOPSIS中的第二种或第三种格式)不再兼容的方式调用getopt。要确定是否安装了getopt的增强版本,可以使用一个特殊的测试选项(-T)。
4、命令选项
选项 | 说明 |
-a, --alternative | 允许长选项以一个 ’-‘ 开头。 |
-h, --help | 输出一个小的使用指南并成功退出。 没有生成其他输出。 |
-l, --longoptions longopts | 要识别的长(多字符)选项。 通过用逗号分隔名称, 可以同时指定多个选项名称。 这个选项可以被给出 不止一次longopts是累积的。 中的每个长选项名 longopts可以后面跟着一个冒号, 表示它有一个必需的参数, 后面跟着两个冒号, 表示它有一个可选的参数。 |
-n, --name progname | getopt常规在报告错误时将使用的名称。 注意,getopt的错误仍然被报告为来自getopt。 |
-o, --options shortopts | 要识别的短(单字符)选项。如果没有找到该选项, 则使用getopt的第一个不以' - '开头的参数 (也不是选项参数)作为短选项字符串。 在shortopts中, 每个短选项字符后面可以跟着一个冒号, 表示它有一个必选参数,后面可以跟着两个冒号, 表示它有一个可选参数。 短消息的第一个字符可能是' + '或' - ', 以影响选项解析和输出生成的方式。 |
-q, --quiet | 禁用getopt错误报告。 |
-Q, --quiet-output | 不生成正常输出。getopt仍然会报告错误, 除非还使用-q。 |
-s, --shell shell | 将引用约定设置为shell的引用约定。 如果没有找到-s参数,则使用BASH约定。 有效参数目前是' sh ' ' bash ', ' csh '和' tcsh '。 |
-u, --unquoted | 不要引用输出。 注意,空格和特殊(依赖于shell的)字符 可能在此模式中造成严重破坏 (就像其他getopt实现一样)。 |
-T --test | 测试getopt是增强版本还是旧版本。 这不会产生任何输出, 并将错误状态设置为4。 getopt的其他实现 (如果设置了环境变量GETOPT_COMPATIBLE) 将返回'--',错误状态为0。 |
-V, --version | 输出版本信息并退出。没有生成其他输出。 |
5、使用示例
使用 -o
或 -l
时,双破折线不能用在optstring前面,需要写在optstring之后(如第三种写法)
getopt命令报错时会继续执行后面的代码,实际使用时需要使用 $?
判断命令执行结果进行处理( 将getopt与eval、set分离处理)。
例如,
!/bin/bash
#eval set -- $(getopt -- a:b:s:u "$@")
cmd_getopt=$(getopt -n $0 -o m::f:: -l mark::,file:: -- "$@")
[ $? -ne 0 ] && exit 1
eval set -- "$cmd_getopt"
while [ "$1" ];do
case $1 in
-m|--mark)
mark="$2"
shift 2;;
-f|--file)
file="$2"
shift 2;;
--)
shift
break;;
*)
echo "Usage [-m|-f] operate"
exit 1;;
esac
done
# 查看结果,可根据实际场景调用case中定义的变量
echo mark -- $mark
echo file -- $file