首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在getopts之后使用shift $(OPTIND-1)的原因是什么?

在getopts之后使用shift $(OPTIND-1)的原因是什么?
EN

Stack Overflow用户
提问于 2014-10-10 07:36:43
回答 1查看 11.7K关注 0票数 16

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

代码语言:javascript
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-10 09:14:20

移位从参数列表中移除由getopts循环处理的参数,以便脚本的其余部分可以使用$1处理命令行的其余部分(如果有的话).按照通常的方式,不关心getopts处理的选项的数量。

考虑一个假设的脚本

代码语言:javascript
复制
frobble [-f] [-c] [-a hostname] filename ...

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

而且,您可以放弃已处理的选项,重新命名其余的参数,从而使您的文件名始终是$1,而不是干扰偏移量和其他东西。

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

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26294218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档