點擊返回 自學Linux命令行與Shell腳本之路html
Bash shell提供了一些不一樣的方法來從用戶處得到數據,包括如下3中方法:linux
13.2-選項處理
所謂的選項就是跟在破折號後面的單個字母,它能改變命令的行爲。三種在腳本處理選項的方法:shell
- 查找選項,像命令行參數同樣處理
- getopts命令
- getopt命令
1. 查找選項,像命令行參數同樣處理
1.1 處理簡單選項bash
![](http://static.javashuo.com/static/loading.gif)
shift命令默認狀況下將每一個參數變量向左移動一個位置。 $3的值會移動到$2中,$2的值會移動到1中,$1的值則會被刪除。
shift n 表示移動的位數
以上腳本經過測試第一個參數值的長度執行了一個while循環,當第一個參數的長度爲0時,循環結束,測試完第一個參數後,shift命令會將全部的參數位置移動一個位置函數
![](http://static.javashuo.com/static/loading.gif)
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 :
![](http://static.javashuo.com/static/loading.gif)
輸入 -a 後面沒有參數的的時候,會報錯誤
舉例2:
![](http://static.javashuo.com/static/loading.gif)
輸入 -a 後面沒有參數的的時候,也會報錯誤
舉例3:
![](http://static.javashuo.com/static/loading.gif)
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 :長選項