getopt(1) command

2024-08-06 08:21:21 浏览数 (3)

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" 是一个常见的用法,用于重新排列和设置命令行参数,以便它们可以被正常处理。让我们详细解释这个表达式的每个部分:

  1. getopt 命令的输出 getopt 命令解析命令行参数并输出一个重新排列的参数列表。这个列表中的选项会按照标准的格式排列,例如,将所有选项和它们的参数放在一起,并处理掉单破折号和双破折号分隔符。
  2. eval 命令 eval 是一个 Bash 内置命令,用于执行一个字符串作为 Bash 命令。它的主要作用是解析并执行传递给它的命令行。
  3. set 命令 set 是一个 Bash 内置命令,用于设置 shell 环境的各种选项和位置参数。在这里,set – 的作用是将接下来的参数设置为位置参数(即 1, 2, …)。
  4. – 双破折号 – 是一个特殊标记,用于告诉 set 命令后面的参数是位置参数,而不是选项。这个标记也用于在命令行中分隔选项和位置参数。
  5. “$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

0 人点赞