天天看點

Linux Bash之getopt指令行參數解析

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
           

下面對腳本進行簡要解釋:

  1. 在開頭可以定義腳本的全局變量,green用于設定字型顔色。
  2. help()函數用于顯示幫助資訊,說明腳本的使用方法。
  3. ARGS=$(getopt -a -n test_getopt.sh -o f:Y:ch --long field:,display-filter:,count,help -- "$@")

    • 短參數一般在前面加單破折号(

      -

      ),長參數使用雙破折号(

      --

      ),

      -a

      選項可以使長參數支援單破折号(

      -

      )
    • 如果參數必須指派,在後面加冒号(

      :

      ),
    • -n test_getopt.sh

      :指定程式名為test_getopt.sh,如果不設定,預設使用getopt
    • -o | --options

      :短選項
    • -l | --longoptions

      :長選項
  4. getopt接收所有輸入後會傳回一個狀态碼,0表示成功,其他值表示失敗,狀态碼會傳遞給變量

    $?

    ,對變量

    $?

    做一個判斷,如果不為0則列印幫助資訊。
  5. eval set -- "$ARGS"

    • eval 指令把字元串當做指令來執行,這裡用于處理參數中的轉義字元。
    • set 指令将指令行參數替換成getopt格式化後的指令行參數,也就是将getopt格式化的參數配置設定至位置參數($1,$2,…)
  6. 接下來就是對參數($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--
歡迎關注公衆号:「測試開發小記」及時接收最新技術文章!

繼續閱讀