【问题标题】:What is a reason for using shift $((OPTIND-1)) after getopts?在 getopts 之后使用 shift $((OPTIND-1)) 的原因是什么?
【发布时间】:2014-10-10 07:36:43
【问题描述】:

我意识到 shift 将 cli args n 空间的数组向左移动,并且 n 的默认值为 1。这意味着我可以在 while 循环中使用 $1 shift 将数组的值分配给现有变量。我不太明白为什么在下面的上下文中使用它。输入参数已分配给值,删除 shift $((OPTIND-1)) 不会改变这一事实。来源:http://linux.die.net/man/3/optind

while getopts ":h:a:fc" opt; do
    case $opt in
        h)
            print_help
            exit 0
            ;;
        a)
            aaaa=${OPTARG}
            ;;
        f)
            force=1
            ;;
        c)
            CLEAN=1
            ;;
        \?)
            echoerr "Invalid option -$OPTARG"
            print_help
            exit 1
            ;;
    esac
done

shift $((OPTIND-1))

【问题讨论】:

  • 如果还有位置参数呢?

标签: bash


【解决方案1】:

shift 将getopts 循环处理的参数从参数列表中移除,以便脚本的其余部分可以以通常的方式处理带有 $1... 的命令行的其余部分(如果有),而无需关注getopts处理的选项数量。

考虑一个带有用法的假设脚本

frobble [-f] [-c] [-a hostname] filename ...

上面的getopts 循环负责解析-f-c-a(如果它们存在),但不会将它们从参数列表中删除。这意味着要获取文件名参数,您需要找出处理了多少选项,然后从那里继续处理。方便的是,getopts 告诉您第一个未处理参数的索引:变量OPTIND

您可以丢弃已处理的选项,对其余参数重新编号,以便您的文件名始终为 $1,而不是弄乱偏移量和其他东西。

shift $((OPTIND-1)) 就是这样做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2017-04-10
    • 2018-01-12
    • 2018-08-31
    • 2020-01-26
    • 2016-03-31
    • 2018-03-30
    相关资源
    最近更新 更多