我使用"getopts“ksh内建来处理命令行选项,我正在寻找一种干净/标准的方法来”取消“命令行上的选项。我不知道这是一个关于getopts的技术问题,还是更多的风格/标准问题。无论如何,我理解getopts从左到右处理它的arg(默认情况下是$*),我希望用它来允许选项的第二个规范“关闭”一个选项。
对于采用选项参数的选项,这不是问题。在我的getopts处理案例语句中,我只是说,对于"-x“选项,例如:
x ) x_arg=$OPTARG
;;
最后一个命令行上的"-x“实例获胜,这就是我想要的。
问题在于不采用选项参数的选项。如果该选项只是一个开关/标志,那么我的case语句将只有如下内容:
x ) x_specified=1
;;
使用这样的选项,我真正能做的就是在命令行中再次添加"-x“,同样的事情也会发生:"x_specified=1”再次被执行。“取消x_specified”的最佳/最简单/最简单/最标准的方法是什么?这是我的问题。
我曾希望调用getopts功能,允许"+“或"-”在选项字母之前,但似乎无法在getopts处理循环中判断"+“或"-”是否被使用。如果有一个方法来判断,那么我就可以采用"+“的标准来关闭设置。我能做的另一件事是:
x ) if [[ -z $x_specified ]] ; then
x_specified=1
else
unset x_specified
fi
;;
现在,"-x“选项将是一个切换;每次在命令行上看到该选项时,设置都会发生变化。但是,我希望命令行上有一种方式,“关闭-x设置”,而不仅仅是“切换-x设置”。我也可以选一些其他的字母。"X",作为关闭它的方法,但我的许多脚本已经使用大写和小写版本的同一字母来表示不同的东西,如果我必须选择其他随机字母来表示“关闭-x”,那就不是很好的记忆了,而且我的脚本已经很难学会如何使用了。
最后,您可能会问,“如果您希望在命令行上关闭-x,那么首先为什么要打开它?”在我的脚本中的选项处理经历了一个多步骤的过程。检查命令行选项,并检查配置文件中的选项,这两者之间有一定的优先级。对于采用选项参数的选项,这一切都很好,但是对于没有选项的选项,方案会分崩离析。
发布于 2013-08-08 20:12:12
我得到了ksh93,如果optstring以“+”开头,它允许+选项:
while getopts +abc opt; do
echo "have option '$opt'"
done
运行此命令:
$ ./args.ksh -a -b -c +b -b foo
have option 'a'
have option 'b'
have option 'c'
have option '+b'
have option 'b'
$ ksh --version
version sh (AT&T Research) 93u+ 2012-08-01
我在手册中看到了一个歧义:它说":“选项也必须是optstring中的”领导“字符。
http://linux.die.net/man/1/ksh93
https://stackoverflow.com/questions/18134669
复制相似问题