[英]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
函数被调用:
一个字符串,用于定义期望的选项以及期望参数的位置。 此字符串仅涵盖File_2
定义的File_2
。
用于选项报告的 shell 变量的名称。
命令行参数列表。 (这简化了从getopts_common
函数内部访问它们的getopts_common
。)
转到源文件( File_1
),我们需要记住getopts_common
函数在File_2
定义的 while 循环内运行:
如果没有任何东西可以解析, getopts
返回false
, || return 1
|| return 1
位确保getopts_common
函数执行相同的操作。
当处理有效选项时,执行需要继续进行循环的下一次迭代。 因此,每个有效的选项匹配都以continue
结尾。
静默错误报告(当 OPTSPEC 以:
开头时启用)允许我们区分INVALID OPTION
和MISSING ARGUMENT
。 后面的错误特定于File_1
定义的公共选项,因此需要将其困在那里。
有关getopts
更深入信息,请参阅Bash Hackers Wiki:Getopts 教程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.