Unix shell 中内置了指令行參數解析函數getopts,但它僅支援簡單的參數解析,不支援長參數,getopt是getopts的增強版,支援長參數。在Python筆記:指令行參數解析中介紹了Python中的指令行參數解析方法getopt(),本文介紹shell中如何使用getopt進行指令行參數解析。
先看下面腳本(test_getopt.sh):
#!/bin/bash
FIELD=unset
DF=unset
COUNT=unset
green='\033[32m'
help()
{
Usage="Usage: sh test_getopt.sh [OPTION] \n\
Options:\n\
[ -f | --field FIELD] \t\t-- 字段 \n \
[ -Y | --display-filter DF] \t-- 條件 \n \
[ -c | --count COUNT ] \t-- 計數 \n \
[ -h | --help ] \t\t-- 幫助資訊 \n \
"
echo -e ${green} $Usage
exit 2
}
ARGS=$(getopt -a -n test_getopt.sh -o f:Y:ch --long field:,display-filter:,count,help -- "$@")
VALID_ARGS=$?
if [ "$VALID_ARGS" != "0" ]; then
help
fi
eval set -- "$ARGS"
while :
do
case "$1" in
-f | --field) FIELD="$2" ; shift 2 ;;
-Y | --display-filter) DF="$2" ; shift 2 ;;
-c | --count) COUNT=2 ; shift ;;
-h | --help) help; exit 0 ; shift ;;
--) shift; break ;;
esac
done
echo "FIELD : $FIELD"
echo "DF : $DF "
echo "COUNT : $COUNT"
echo "其餘參數: $@"
exit 0
下面對腳本進行簡要解釋:
- 在開頭可以定義腳本的全局變量,green用于設定字型顔色。
- help()函數用于顯示幫助資訊,說明腳本的使用方法。
-
ARGS=$(getopt -a -n test_getopt.sh -o f:Y:ch --long field:,display-filter:,count,help -- "$@")
- 短參數一般在前面加單破折号(
),長參數使用雙破折号(-
),--
選項可以使長參數支援單破折号(-a
)-
- 如果參數必須指派,在後面加冒号(
),:
-
:指定程式名為test_getopt.sh,如果不設定,預設使用getopt-n test_getopt.sh
-
:短選項-o | --options
-
:長選項-l | --longoptions
- 短參數一般在前面加單破折号(
- getopt接收所有輸入後會傳回一個狀态碼,0表示成功,其他值表示失敗,狀态碼會傳遞給變量
,對變量$?
做一個判斷,如果不為0則列印幫助資訊。$?
-
:eval set -- "$ARGS"
- eval 指令把字元串當做指令來執行,這裡用于處理參數中的轉義字元。
- set 指令将指令行參數替換成getopt格式化後的指令行參數,也就是将getopt格式化的參數配置設定至位置參數($1,$2,…)
- 接下來就是對參數($1,$2,…)進行周遊處理
- 通過shift來移動擷取參數,用它來實作移動一個或者多個位置(也就是彈棧)
- 每次循環,檢查
參數,對于必須指派的參數,需要移動兩位,因為它後面跟了一個參數值,需要移動兩位才能到下一個參數。取值為$1
,因為第一個參數為選項名稱,第二個參數才是參數值。$2
- 移位到
後,表示所有參數解析完成,退出循環。--
運作:
$ sh test_getopt.sh --help
Usage: sh test_getopt.sh [OPTION]
Options:
[ -f | --field FIELD] -- 字段
[ -Y | --display-filter DF] -- 條件
[ -c | --count COUNT ] -- 計數
[ -h | --help ] -- 幫助資訊
$
$ sh test_getopt.sh -c -f test -Y hello test2
FIELD : test
DF : hello
COUNT : 2
其餘參數: test2
--THE END-- 歡迎關注公衆号:「測試開發小記」及時接收最新技術文章!