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的联机帮助页中记录了该限制:
尽管getopt允许“可选选项参数”,但它们通常被认为是一个坏主意.例如,Posix Utility Syntax Guidelines包括:
本指南的基本原因是按照惯例,命令行选项的参数可以是任何字符串.例如,它可能看起来像另一种选择.它可能是文字字符串 – 通常表示选项列表的结尾.它可能是一个空字符串.任何东西. “可选选项参数”的问题在于,知道未提供可选选项参数的唯一方法是将以下参数识别为选项或 – .但这意味着可选参数的值不能以 – 开头. 或者,您可以选择getopt命令行实用程序采用的解决方案,即要求可选参数紧跟在该选项之后,而没有中间空格(即,在同一个单词中).但在这种情况下,可选参数不能是空字符串. 而不是创建复杂的规则来解决这些歧义,Posix推荐的简单解决方案(并且,我的权限很少) – 是不允许选项参数是可选的.如果命令行选项有一个共同的值,并且您希望通过不要求键入它来简化用户的生命周期,那么实现两个不同的命令行选项,其中一个选择参数,另一个选择参数没有.常用技术包括对不带参数的版本使用小写字符,对带有参数的版本使用相应的大写字符,或者对该版本使用长选项(–option). 对于那些喜欢密集和简洁解释的人,Posix rationale解释说:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |