繁体   English   中英

BASH getopts 多个具有相同选项的脚本

[英]BASH getopts Multiple Scripts with Same Options

我有一系列 BASH 脚本。

我正在使用 getopts 来解析来自 cmd 行的参数(尽管对替代方案开放)。

这些脚本有一系列通用选项,称为此选项集 A ie queue、ncores 等。

每个脚本都有一系列额外的选项,即设置 B1、B2、B3。

我想要的是脚本

"1 to be able to take options  A+B1"
"2 to be able to take options  A+B2"
"3 to be able to take options  A+B2"

但我希望能够将选项 A 的代码存储在中央位置(库/函数)中,而不必在每个脚本中写出。

我想要的是一种在 getopts 中插入通用代码的方法。 或者,一种运行 getopts 两次的方法。

事实上,我已经通过将 getopts 作为一个源函数来做到这一点。

但问题是我无法获得无法识别的选项来处理它们。 我想一种方法是在传递给 B1、B2、B3 等的 getopts 之前从字符串中删除选项 A 中的参数?

谢谢罗杰

这是一个很好的问题,要回答这个问题,我们需要对getopts工作原理有很好的了解。

这里的关键点是getopts旨在在单个循环中迭代提供的参数。 因此,该问题的解决方案是在不同文件之间拆分循环,而不是运行该命令两次:

#!/usr/bin/env bash
# File_1

getopts_common() {
    builtin getopts ":ab:${1}" ${2} ${@:3} || return 1
    case ${!2} in
        'a')
            echo 'a triggered'
            continue
            ;;
        'b')
            echo "b argument supplied -- ${OPTARG}"
            continue
            ;;
        ':')
            echo "MISSING ARGUMENT for option -- ${OPTARG}" >&2
            exit 1
            ;;
    esac
}

#!/usr/bin/env bash
# File_2
# source "File_1"

while getopts_common 'xy:' OPTKEY ${@}; do
    case ${OPTKEY} in
        'x')
            echo 'x triggered'
            ;;
        'y')
            echo "y argument supplied -- ${OPTARG}"
            ;;
        '?')
            echo "INVALID OPTION -- ${OPTARG}" >&2
            exit 1
            ;;
        ':')
            echo "MISSING ARGUMENT for option -- ${OPTARG}" >&2
            exit 1
            ;;
        *)
            echo "UNIMPLEMENTED OPTION -- ${OPTKEY}" >&2
            exit 1
            ;;
    esac
done

实施说明

我们从File_2开始,因为这是脚本执行开始的地方:

  • 我们不是直接调用getopts ,而是通过它的代理调用它: getopts_common ,它负责处理所有公共选项。

  • getopts_common函数被调用:

    1. 一个字符串,用于定义期望的选项以及期望参数的位置。 此字符串仅涵盖File_2定义的File_2

    2. 用于选项报告的 shell 变量的名称。

    3. 命令行参数列表。 (这简化了从getopts_common函数内部访问它们的getopts_common 。)

转到源文件( File_1 ),我们需要记住getopts_common函数在File_2定义的 while 循环内运行

  • 如果没有任何东西可以解析, getopts返回false|| return 1 || return 1位确保getopts_common函数执行相同的操作。

  • 当处理有效选项时,执行需要继续进行循环的下一次迭代。 因此,每个有效的选项匹配都以continue结尾。

  • 静默错误报告(当 OPTSPEC 以:开头时启用)允许我们区分INVALID OPTIONMISSING ARGUMENT 后面的错误特定于File_1定义的公共选项,因此需要将其困在那里。

有关getopts更深入信息,请参阅Bash Hackers Wiki:Getopts 教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM