getopt 是一个广泛使用的命令行工具,用于解析复杂的命令行选项。它提供了一种标准化的方式来处理短选项和长选项,以及选项的参数,使得编写和维护命令行工具变得更加容易。
注意,与 getopt 类似的一个命令 getopts 是 Shell 内建命令,其功能没有 getopt 强大,只支持短选项,不能解析长选项。
getopt OPTSTRING PARAMETERS
getopt [OPTIONS] [--] OPTSTRING PARAMETERS
getopt [OPTIONS] -o|--options OPTSTRING [OPTIONS] [--] PARAMETERS
OPTIONS
:getopt 命令本身的选项。--
:可选,用于明确区分 getopt 命令的选项和需要解析的选项字符串。OPTSTRING
:描述选项格式的字符串。PARAMETERS
:需要解析的实际命令行参数。OPTSTRING 是一个描述可接受选项的字符串。短选项(单个字母)直接写在字符串中,如果选项需要参数,则在字母后跟一个冒号(:)。例如:
a
选项 -a,无参数。b:
选项 -b,带一个参数。c::
选项 -c,带一个可选参数(非标准用法)。getopt 命令本身支持多种选项来控制其行为:
-a, --alternative
允许长选项以单个'-'开头
-l, --longoptions LONGOPTS
指定要识别的长(多字符)选项。可以一次指定多个选项名称,名称之间用逗号分隔。此选项可以多次给出,长期选项是累积的。每个长选项名后面可以跟一个冒号,表示它有一个必需的参数,后面跟两个冒号,表示它有一个可选的参数
-n, --name PROGNAME
用于出错时显示的程序名称。注意,getopt(1) 的错误仍然报告为来自 getopt。
-o, --options SHORTOPTS
指定要识别的短(单个字符)选项。如果找不到此选项,则使用getopt的第一个不以'-'开头的参数作为短选项字符串。每个短选项字符后面可以跟一个冒号,表示它有一个必需的参数。后面跟两个冒号,表示它有一个可选参数。
-q, --quiet
安静模式,不输出错误信息。
-Q, --quiet-output
不产生正常输出,但仍然会报告错误,除非您也使用 -q。
-s, --shell SHELL
将引用约定设置为指定的 Shell。如果没有给出-s选项,则使用BASH约定。目前有效的参数是 sh,bash,csh 和 tcsh。
-T, --test:
测试您的 getopt(1) 是这个增强版本还是旧版本。这不会产生输出,并设置错误状态 4。如果有设置环境变量 GETOPT_COMPATIBLE,getopt(1) 的其他实现,以及此版本将返回 -- 和错误状态0。
-u, --unquoted
不要引用输出。注意,空格和特殊(依赖于Shell的)字符在这种模式下可能会造成严重破坏(就像其他 getopt(1) 实现中所做的那样)。
--
表示选项结束,后面的所有内容都作为参数。
-h, --help
打印帮助信息并退出。
-V, --version
打印版本并退出。
(1)解析短选项。
#!/bin/bash
OPTIONS=$(getopt -o ab:c -- "$@")
if [ $? -ne 0 ]; then
echo "Failed to parse options."
exit 1
fi
eval set -- "$OPTIONS"
while true; do
case "$1" in
-a)
echo "Option a"
shift
;;
-b)
echo "Option b with argument: $2"
shift 2
;;
-c)
echo "Option c"
shift
;;
--)
shift
break
;;
*)
echo "Invalid option: $1"
exit 1
;;
esac
done
echo "Remaining arguments: $@"
其中eval set -- "$OPTIONS"
是一个常见的用法,用于重新排列和设置命令行参数,以便它们可以被正常处理。让我们详细解释这个表达式的每个部分:
当你运行 eval set -- "$OPTIONS"
时,以下事情会发生:
(2)带长选项的解析。
#!/bin/bash
OPTIONS=$(getopt -o ab:c --long alpha,beta:,gamma -- "$@")
if [ $? -ne 0 ]; then
echo "Failed to parse options."
exit 1
fi
eval set -- "$OPTIONS"
while true; do
case "$1" in
-a | --alpha)
echo "Option alpha"
shift
;;
-b | --beta)
echo "Option beta with argument: $2"
shift 2
;;
-c | --gamma)
echo "Option gamma"
shift
;;
--)
shift
break
;;
*)
echo "Invalid option: $1"
exit 1
;;
esac
done
echo "Remaining arguments: $@"
getopt(1) - Linux manual page - man7.org bash(1) - Linux manual page - man7.org