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

时间:2018-11-02 15:45:25

标签: linux bash scripting getopts

我有一系列的BASH脚本。

我正在使用getopts来解析cmd行中的参数(尽管可以选择)。

这些脚本有一系列常用选项,称为A选项集 即队列,ncore等。

然后每个脚本都有一系列附加选项,即设置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中的争论?

感谢罗杰

1 个答案:

答案 0 :(得分:1)

这是一个非常好的问题,要回答这个问题,我们需要对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中定义的选项。

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

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

继续到源文件(File_1),我们需要记住getopts_common函数运行在File_2中定义的while循环中: / p>

    如果没有要解析的内容,
  • getopts将返回false|| return 1位可确保getopts_common函数执行相同的操作。

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

  • 静音错误报告(在OPTSPEC以:开头时启用)使我们能够区分INVALID OPTIONMISSING ARGUMENT。后面的错误特定于File_1中定义的常用选项,因此需要将其困在其中。

有关getopts的更多详细信息,请参见Bash Hackers Wiki: Getopts tutorial