前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >getopt(1) command

getopt(1) command

作者头像
恋喵大鲤鱼
发布2024-08-06 08:21:21
850
发布2024-08-06 08:21:21
举报
文章被收录于专栏:C/C++基础

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.简介
  • 2.格式
  • 3.选项
  • 4.示例
  • 参考文献
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档