我使用内置的“getopts”ksh来处理命令行选项,我正在寻找一种干净/标准的方法在命令行上“取消设置”一个选项。我不知道这是关于getopts或更多样式/标准问题的技术问题。无论如何,我知道getopts从左到右处理它的args(默认为$ *),我希望用它来允许第二个选项规范“关闭”一个选项。
对于采用选项参数的选项,这不是问题。在我的getopts处理案例陈述中,我只是说,对于“-x”选项,例如:
x ) x_arg=$OPTARG
;;
并且命令行中的“-x”的最后一个实例获胜,这就是我想要的。
问题在于不带选项参数的选项。如果该选项只是一个开关/标志,那么我的case语句将只有:
x ) x_specified=1
;;
使用像这样的选项我只能在命令行上再次添加“-x”,同样的事情就会发生:“x_specified = 1”再次执行。 “unset x_specified”的最佳/最简单/最简单/最常用的方法是什么?那是我的问题。
我原本希望调用getopts功能,允许“+”或“ - ”在选项字母之前,但似乎没有办法在getopts处理循环中判断是否使用了“+”或“ - ”。如果有办法告诉我那么我可以采用“+”意味着关闭设置的标准。我能做的另一件事就是:
x ) if [[ -z $x_specified ]] ; then
x_specified=1
else
unset x_specified
fi
;;
现在“-x”选项将是一个切换;每次在命令行上看到设置都会改变。但是,我想在命令行上说“关闭-x设置”,而不仅仅是“切换-x设置”。我还可以选择其他一些字母,例如“X”,作为关闭它的方式,但我的许多脚本已经使用同一个字母的大写和小写版本来表示不同的东西,如果我必须选择一些其他随机字母表示“转” off -x“那么这不是很麻烦,我的脚本很难学会如何使用。
最后,您可能会问:“如果您想在命令行中关闭-x,那么为什么要首先打开它?”我脚本中的选项处理经历了一个多步骤过程。检查命令行选项,并检查配置文件的选项,两者之间有一个优先级。这一切都适用于带有选项参数的选项,但是对于没有选项参数的选项,该方案会分崩离析。
答案 0 :(得分:1)
我有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中的“前导”字符。