加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:50:23 所属栏目:安全 来源:网络整理
导读:我意识到shift会将cli args n空间数组向左移动,n的默认值为1.这意味着我可以在while循环中使用$1 shift将数组的值赋给现有的varibles.我不太明白为什么在下面这个背景下使用它.输入参数已经分配给值,删除shift $((OPTIND-1))不会改变这个事实.资料来源: htt
我意识到shift会将cli args n空间数组向左移动,n的默认值为1.这意味着我可以在while循环中使用$1 shift将数组的值赋给现有的varibles.我不太明白为什么在下面这个背景下使用它.输入参数已经分配给值,删除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))

解决方法

该移位从参数列表中删除了getopts循环处理的参数,以便脚本的其余部分可以以通常的方式处理$1的命令行的剩余部分(如果有的话),而不用考虑数量由getopts处理的选项.

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

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

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

而不是搞乱偏移和东西,你可以放弃处理过的选项,重新编号其余的参数,这样你的文件名总是1美元.

这就是$((OPTIND-1))的转变.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读