2014-10-10 664 views
3

我意识到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)) 
+1

如果还有位置参数会怎么样? – 2014-10-10 07:41:21

回答

8

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

考虑一个假想脚本使用

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

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

而不是搞乱补偿和东西,你可以放弃处理的选项,重新编号其余的参数,所以你的文件名总是$1

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

相关问题