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))的转变. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |