bash – 为什么我不能使用getopt在选项和可选参数之间有空格?

使用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,no argument

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

./mkqueue.sh -p adfsa -qsdfasdfa
Option p,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允许“可选选项参数”,但它们通常被认为是一个坏主意.例如,Posix Utility Syntax Guidelines包括

Guideline 7: Option-arguments should not be 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.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...