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


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

Bash shell提供了一些不同的方法來從用戶處獲得數據,包括以下3中方法:

13.2-選項處理

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

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

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

 1.1 處理簡單選項

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

 

 1.2 分離參數和選項

同時使用參數和選項怎么辦,linux使用特殊字符   --    將二者分開,該字符告訴腳本什么時候選項結束以及普通參數什么時候開始。

 1.3 處理帶值的選項

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

2. getopts命令

由於shell命令行的靈活性,自己編寫代碼判斷時,復雜度會比較高。為此,C提供了getopt/getopt_long等函數,C++的boost提供了Options庫,在shell中,處理此事的是getopts和getopt。

本節首先介紹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  :長選項

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM