我对 的经验不是很丰富getopt
,但在我见过的所有代码中,它仅用于重新排序程序参数,然后使用 switch/case 来解码正在使用哪些选项和参数,因此通常需要解析(或跳过)全部同时进行。
如果我不想进行此处理,而是将选项视为字典并在实际需要时选取它们怎么办?类似的东西get_option_value -o "x:"
会返回实际的参数值,或者标志的 true/false。
显然,这可以轻松地手动完成,并且在复杂性方面总是更有效,但我想实际上存在这种“易于使用”的功能,只是我没有偶然发现它。
答案1
首先,如果您使用的是 bash,请运行help getopts
.这很好地概括了它getopts
是什么以及它的作用。否则,请getopts
在手册页中搜索您的 shell。
话虽如此,重要的是要注意,它getopts
不会搜索特定选项,它会获取下一个命令行参数(始终位于 中"$1"
)。由您的脚本使用该选项(及其参数,如果有的话)执行某些操作,并从命令行中删除它/它们。
这optstring
不是一个搜索字符串,它是一个验证字符串 - 它告诉getopts
哪些选项是有效的以及它们是否应该接受参数,以便它可以打印错误消息或允许您的脚本知道选项发生处理错误,因此可以采取适当的措施。
如果您想在脚本中的任意时间/位置查找特定选项,那么您必须执行其他程序所做的操作,并在脚本执行后不久解析选项,并将结果存储在变量中。
也就是说,你必须做你所说的你不想做的事 - 如果你想使用,没有其他办法getopts
。
没有什么可以阻止您编写自己的程序或函数来在命令行中搜索一个特定选项(及其值,如果有的话),但没有人这样做的原因是没有意义 - 它更容易、更高效在循环中一次解析所有选项,而不是将它们作为临时查询进行解析/搜索(因为该搜索程序/函数每次调用时都必须循环遍历选项和参数,使用getopts
或迭代"$@"
如果是 shell 函数,则使用脚本的副本;getopt()
如果是独立程序,则使用 libc 函数)。
执行此操作的常见方法是将变量设置为其默认值(如果有),然后处理每个选项,在看到选项时更改默认值。
一个非常简单的例子,x和y接受参数,b是一个布尔值:
x=10
y=20
b=0
while getopts "x:y:b" opt; do
case "$opt" in
x) x="$2" ; shift ;;
y) y="$2" ; shift ;;
b) b=1 ;;
esac
shift
done
echo "x=$x"
echo "y=$y"
echo "b=$b"
答案2
getopts
您可以通过(重新)设置变量来多次扫描参数列表OPTIND
。这bash手册说
getopts
shell 脚本使用它来解析位置参数。 optstring 包含要识别的选项字符;如果一个字符后跟一个冒号,则该选项应该有一个参数,该参数应与它分隔开空白。冒号(':')和问号('?')不能用作选项字符。每次调用它时,getopts
将下一个选项放入 shell 变量名中,如果不存在则初始化 name,并将下一个要处理的参数的索引放入变量中OPTIND
。OPTIND
被初始化为1
每次调用 shell 或 shell 脚本时。当选项需要参数时,getopts 将该参数放入变量中OPTARG
。外壳不重置OPTIND
自动地;如果要使用一组新参数,则必须在同一 shell 调用中多次调用 getopts 之间手动重置它。
它还提到您不需要使用原始参数集:
getopts
通常解析位置参数,但如果提供更多参数精氨酸价值观,getopts
而是解析它们。