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 :長選項
