1. 程式人生 > >shell指令碼中使用getopts處理多命令列選項

shell指令碼中使用getopts處理多命令列選項

在Linux系統中,許多命令都提供了選項,使用不同的選項就會得到不通的執行結果

例如:ls命令,ls命令提供了多個選項:-l、-a、-A、-h、-i等等,每個選項具有不同的功能,我們自己寫指令碼時也可以定義選項,提示使用者如何使用,本文介紹如何使用getopts命令來處理命令選項。

1.getopts命令的如何使用:

用getopts命令獲取到指令碼選項後,getopts會將獲取到的選項所對應的引數(選項對應的引數,並不是選項本身,有的命令選項後面是需要跟一個引數的,例如tcpdump 的-w選項,後面需要指定一個檔案來儲存抓包資料)自動儲存到OPTARG這個變數中。

getopts命令格式:getopts   OPTSTRING  VARNAME   

OPTSTRING:告訴getopts會有哪些選項和引數(用選項後面加“:”來表示選項後面需要加引數)

VARNAME:儲存getopts獲取到的選項

示例:getopts  ahf:   var

告訴getopts查詢-a、-h、-f選項,其中f選項後面需要跟一個引數,獲取到的選項都儲存到變數var中

getopts命令支援兩種錯誤報告模式,詳細錯誤報告模式和抑制錯誤報告模式。

在詳細錯誤報告模式下:如果getopts檢測到一個無效的選項,var的值會被設定為(?);如果getopts檢測到一個後面需要跟引數的選項,後面沒有引數,var的值也會被設定為(?)

在抑制錯誤報告模式下:如果getopts檢測到一個無效的選項,var的值會被設定為(?),變數OPTARG會被設定為這個無效的選項;如果getopts檢測到一個後面需要跟引數的選項,後面沒有引數,var的值會被設定為(:),變數OPTARG會被設定為這個無效的選項

2.通過指令碼來講解getopts如何獲取選項,如何賦值給變數VARNAME和OPTSTRING:

示例:

#!/bin/bash
status=off                 #定義變數status,初始值設定為off
filename=""              #定義變數filename,用於儲存選項引數(檔案)
output=""                 #定義變數output,用於儲存選項引數(目錄)
Usage () {                  #定義函式Usage,輸出指令碼使用方法
    echo "Usage"
    echo "myscript [-h] [-v] [-f <filename>] [-o <filename>]"
    exit -1
}

while getopts :hvf:o: varname   #告訴getopts此指令碼有-h、-v、-f、-o四個選項,-f和-o後面需要跟引數

(沒有選項時,getopts會設定一個退出狀態FALSE,退出迴圈)

do
   case $varname in
    h)
      echo "$varname"
      Usage
      exit
      ;;
    v)
      echo "$varname"
      status=on
      echo "$status"
      exit
      ;;
    f)
      echo "$varname"
      echo "$OPTARG"
      filename=$OPTARG                    #將選項的引數賦值給filename
      if [ ! -f $filename ];then               #判斷選項所跟的引數是否存在且是檔案
         echo "the source file $filename not exist!"
         exit
      fi
      ;;
    o)
      echo "$varname"
      echo "$OPTARG"
      output=$OPTARG                      #將選項引數賦值給output
      if [ ! -d  $output ];then               #判斷選項引數是否存在且是目錄
         echo "the output path $output not exist"
         exit
      fi
      ;;
    :)                                               #當選項後面沒有引數時,varname的值被設定為(:),OPTARG的值被設定為選項本身

      echo "$varname"

      echo "the option -$OPTARG require an arguement"        #提示使用者此選項後面需要一個引數
      exit 1
      ;;
    ?)                                   #當選項不匹配時,varname的值被設定為(?),OPTARG的值被設定為選項本身
      echo "$varname"
      echo "Invaild option: -$OPTARG"           #提示使用者此選項無效
      Usage
      exit 2
      ;;
    esac
done