1.简介
getopt 是一个广泛使用的命令行工具,用于解析复杂的命令行选项。它提供了一种标准化的方式来处理短选项和长选项,以及选项的参数,使得编写和维护命令行工具变得更加容易。
注意,与 getopt 类似的一个命令 getopts 是 Shell 内建命令,其功能没有 getopt 强大,只支持短选项,不能解析长选项。
2.格式
代码语言:javascript复制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,带一个可选参数(非标准用法)。
3.选项
getopt 命令本身支持多种选项来控制其行为:
代码语言:javascript复制-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
打印版本并退出。
4.示例
(1)解析短选项。
代码语言:javascript复制#!/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"
是一个常见的用法,用于重新排列和设置命令行参数,以便它们可以被正常处理。让我们详细解释这个表达式的每个部分:
- getopt 命令的输出 getopt 命令解析命令行参数并输出一个重新排列的参数列表。这个列表中的选项会按照标准的格式排列,例如,将所有选项和它们的参数放在一起,并处理掉单破折号和双破折号分隔符。
- eval 命令 eval 是一个 Bash 内置命令,用于执行一个字符串作为 Bash 命令。它的主要作用是解析并执行传递给它的命令行。
- set 命令 set 是一个 Bash 内置命令,用于设置 shell 环境的各种选项和位置参数。在这里,set – 的作用是将接下来的参数设置为位置参数(即 1, 2, …)。
- – 双破折号 – 是一个特殊标记,用于告诉 set 命令后面的参数是位置参数,而不是选项。这个标记也用于在命令行中分隔选项和位置参数。
- “$OPTIONS” 这是 getopt 命令解析后的输出,包含了重新排列的选项和参数。
当你运行 eval set -- "$OPTIONS"
时,以下事情会发生:
- getopt 解析命令行参数并输出一个重新排列的参数列表,赋值给变量 OPTIONS。
- eval 解析并执行 set – “$OPTIONS”,这将 OPTIONS 中的内容作为参数传递给 set 命令。
- set -- 设置位置参数,使得脚本可以使用标准的 1, 2, … 来访问命令行参数。
(2)带长选项的解析。
代码语言:javascript复制#!/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