我使用内置的“getopts”ksh 来处理命令行选项,并且我正在寻找一种干净/标准的方式来“取消设置”命令行上的选项。我不知道这是关于 getopts 的技术问题还是更多的样式/标准问题。无论如何,我知道 getopts 从左到右处理它的参数(默认为 $*),我希望使用它来允许选项的第二个规范来“关闭”一个选项。
对于带有选项参数的选项,这不是问题。在我的 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,为什么要首先打开它?” 我的脚本中的选项处理经历了一个多步骤的过程。检查命令行选项,并检查配置文件的选项,两者之间有优先级。这一切都适用于带有选项参数的选项,但对于不带选项参数的选项,该方案就崩溃了。