我有一系列的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中的争论?
感谢罗杰
答案 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
函数的调用方式为:
一个字符串,它定义期望的选项以及期望的参数位置。该字符串仅包含File_2
中定义的选项。
用于选项报告的shell变量的名称。
命令行参数列表。 (这简化了从getopts_common
函数内部对其的访问。)
继续到源文件(File_1
),我们需要记住getopts_common
函数运行在File_2
中定义的while循环中: / p>
getopts
将返回false
,|| return 1
位可确保getopts_common
函数执行相同的操作。
当处理有效选项时,执行需要继续执行循环的下一个迭代。因此,每个有效的选项匹配都以continue
结尾。
静音错误报告(在OPTSPEC以:
开头时启用)使我们能够区分INVALID OPTION
和MISSING ARGUMENT
。后面的错误特定于File_1
中定义的常用选项,因此需要将其困在其中。
有关getopts
的更多详细信息,请参见Bash Hackers Wiki: Getopts tutorial