2014-10-10 29 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))所做的。

相關問題