gpt4 book ai didi

bash - 为什么我不能使用 getopt 在选项和可选参数之间留一个空格?

转载 作者:行者123 更新时间:2023-11-29 08:59:37 24 4
gpt4 key购买 nike

当使用 getopt 解析命令行参数时,您可以在选项标志和参数之间放置一个空格,用于必需参数,但不能用于可选参数。可选参数只有在紧跟在选项之后才会被解析。

TEMP=`getopt -o p:q:: -n 'mkqueue.sh' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"

# Now go through all the options
while true ; do
case "$1" in
-p) echo "Option p, argument \`$2'" ; shift 2 ;;
-q)
case "$2" in
"") echo "Option q, no argument"; shift 2 ;;
*) echo "Option q, argument \`$2'" ; shift 2 ;;
esac ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done

(基于此:http://software.frodo.looijaard.name/getopt/docs/getopt-parse.bash)

当我在没有可选参数的情况下运行脚本时,它起作用了:

./mkqueue.sh -p adfsa -q
Option p, argument `adfsa'
Option q, no argument

如果我尝试将可选参数添加到 -q 并且中间有一个空格,则它不起作用:

./mkqueue.sh -p adfsa -q sdfasdfa
Option p, argument `adfsa'
Option q, no argument

如果您在选项和参数之间没有空格,它会起作用,即使必需的参数可以使用空格:

./mkqueue.sh -p adfsa -qsdfasdfa
Option p, argument `adfsa'
Option q, argument `sdfasdfa'

有解决办法吗?

最佳答案

该限制记录在 getopt 的联机帮助页中:

A simple short option is a `-' followed by a short option character. If the option has a required argument, it may be written directly after the option character or as the next parameter (ie. separated by whitespace on the command line). If the option has an optional argument, it must be written directly after the option character if present.

尽管 getopt 允许“ optional 参数”,但它们通常被认为是一个坏主意。 Posix Utility Syntax Guidelines ,例如,包括:

Guideline 7: Option-arguments should not be optional.

这条准则的基本原因是,按照惯例,命令行选项的参数可以是任何字符串。例如,它可能看起来像是另一种选择。它可能是文字字符串 --,通常表示选项列表的结尾。它可能是一个空字符串。任何东西。

“ optional 参数”的问题在于,知道未提供 optional 参数的唯一方法是将以下参数识别为选项或 --。但这意味着可选参数的值不能以 - 开头。

或者,您可以选择 getopt 命令行实用程序采用的解决方案,即要求可选参数紧跟在选项之后,中间没有空格(即,在同一个词)。但在这种情况下,可选参数不能为空字符串。

与其创建复杂的规则来解决这些歧义,简单的解决方案——Posix 推荐的(并且,我的权限要小得多)——不允许选项参数是可选的。如果命令行选项有一个共同的值,并且您希望通过不要求键入它来简化用户的生活,那么实现两个不同的命令行选项,其中一个接受一个参数,另一个接受一个参数没有。常见的技术包括为不带参数的版本使用小写字符,为带参数的版本使用相应的大写字符,或者为该版本使用长选项 (--option) .

对于那些喜欢密集解释的人,Posix rationale解释说:

Guideline 7 allows any string to be an option-argument; an option-argument can begin with any character, can be - or --, and can be an empty string. For example, the commands pr -h -, pr -h --, pr -h -d, pr -h +2, and pr -h '' contain the option-arguments -, --, -d, +2, and an empty string, respectively. Conversely, the command pr -h -- -d treats -d as an option, not as an argument, because the -- is an option-argument here, not a delimiter.

关于bash - 为什么我不能使用 getopt 在选项和可选参数之间留一个空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26431682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com