自學Linux Shell13.2-選項處理(主要getopt、getopts命令)

點擊返回 自學Linux命令行與Shell腳本之路html

Bash shell提供了一些不一樣的方法來從用戶處得到數據,包括如下3中方法:linux

13.2-選項處理

所謂的選項就是跟在破折號後面的單個字母,它能改變命令的行爲。三種在腳本處理選項的方法:shell

  • 查找選項,像命令行參數同樣處理
  • getopts命令
  • getopt命令

1. 查找選項,像命令行參數同樣處理

 1.1 處理簡單選項bash

shift命令默認狀況下將每一個參數變量向左移動一個位置。 $3的值會移動到$2中,$2的值會移動到1中,$1的值則會被刪除。
shift n 表示移動的位數
以上腳本經過測試第一個參數值的長度執行了一個while循環,當第一個參數的長度爲0時,循環結束,測試完第一個參數後,shift命令會將全部的參數位置移動一個位置函數

 

 1.2 分離參數和選項工具

同時使用參數和選項怎麼辦,linux使用特殊字符   --    將兩者分開,該字符告訴腳本何時選項結束以及普通參數何時開始。測試

 1.3 處理帶值的選項spa

 有時候選項會帶上一個額外的參數值。此時要求腳本必須能檢測到並正確處理。命令行

2. getopts命令

因爲shell命令行的靈活性,本身編寫代碼判斷時,複雜度會比較高。爲此,C提供了getopt/getopt_long等函數,C++的boost提供了Options庫,在shell中,處理此事的是getopts和getopt。code

本節首先介紹getopts命令

1 getopts optstring parameters
  • getopts命令內建於bash shell中
  • getopts命令可以和已有的shell參數變量默契配合
  • getopts命令,每次調用它的時候,它一次只處理命令行上檢測到的一個參數
  • getopts命令,有效的選項字母都會列在optstring中
        若是選項字母要求有個參數值就加一個:   
        要去掉一個錯誤消息的話,能夠再opstring以前加一個:
  • getopts命令會用到兩個環境變量,
        若是選項須要跟一個參數值,OPTARG環境變量就會保存這個值。
        OPTIND環境變量保存了參數列表中getopts正在處理的參數位置。

舉例1 :

輸入 -a 後面沒有參數的的時候,會報錯誤

 舉例2:

 

輸入 -a 後面沒有參數的的時候,也會報錯誤

舉例3:

optstring位置是h:ms 
首先最前面沒有:,就表示不會提示錯誤信息
h:表示選項-h 須要跟一個參數,並保存到OPTARG環境變量中,

3. getopt命令

 getopts命令來幫助咱們處理shell腳本選項和參數,其缺點是隻能處理短選項,沒法處理長選項。
 getopt是一個外部命令。

1 getopt  optstring parameters
  • #-o表示短選項,兩個冒號表示該選項有一個可選參數,可選參數必須緊貼選項,如-carg 而不能是-c arg
  • #--long表示長選項

其實大部分都和getopt命令相同,個別不一樣:

  • 選項:  表示-b選項須要一個參數值
  • -cd 會自動將分紅兩個獨立的選項-c -d  (但此時會插入雙破折線分割行中的額外參數)
  • 指定了一個不存在的選項,會產生一條錯誤信息
  • 如想忽略這條錯誤信息,能夠在命令後加一個-q選項    getopt -q

4. 二者的比較

  • getopts 是 Shell 內建命令,getopt 是一個獨立外部工具
  • getopts 使用語法簡單,getopt 使用語法較複雜
  • getopts 不支持長參數(如:--option ),getopt 支持
  • getopts 不會重排全部參數的順序,getopt 會重排參數順序
  • getopts 出現的目的是爲了代替 getopt, 較快捷的執行參數分析工做

參數傳遞的典型用法:

  •  ./test.sh -a -b -c  : 短選項,各選項不需參數
  •  ./test.sh -abc      : 短選項,和上一種方法的效果同樣,只是將全部的選項寫在一塊兒。
  •   ./test.sh -a args -b -c   :短選項,其中-a須要參數,而-b -c不需參數。
  •   ./test.sh --a-long=args --b-long  :長選項
相關文章
相關標籤/搜索