【问题标题】:ksh "getopts" -- Unsetting an Optionksh "getopts" -- 取消设置选项
【发布时间】:2013-08-10 16:13:40
【问题描述】:

我使用内置的“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”,作为关闭它的方式,但我的许多脚本已经使用同一个字母的大写和小写版本来表示不同的东西,如果我必须选择一些其他随机字母来表示“转off -x" 那么这不是很容易记忆,而且我的脚本已经很难学会如何使用了。

最后,你可能会问,“如果你想在命令行上关闭 -x,你为什么要首先打开它?”我的脚本中的选项处理经历了一个多步骤的过程。检查命令行选项,并检查配置文件的选项,两者之间有优先级。这一切都适用于带有选项参数的选项,但对于不带选项参数的选项,该方案就崩溃了。

【问题讨论】:

    标签: ksh


    【解决方案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 中的“前导”字符。

    http://linux.die.net/man/1/ksh93

    【讨论】:

    • 效果很好。如果看到 opt var 有一个前导“+”,那么我可以在我的 getopts 循环中做我需要做的事情。关于选项字符串中的前导“:”,我认为这只是为了控制看到无效选项时的行为。因此,如果要允许“+”和“-”引入选项,请将“+”添加到选项字符串的开头。如果您还想调用与“:”相关的特殊行为,则将“:+”添加到选项字符串的开头。
    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 2015-07-16
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2012-01-19
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多