1. 程式人生 > >Open Source Project Share的專欄

Open Source Project Share的專欄

Bash shell 內建命令getopts類似於C標準庫

getopts有兩個引數,一個由字母和冒號組成的字串以及一個變數名。第一個引數是合法選項的列表;如果選項需要一個引數,那麼引數後面必須跟一個冒號。

getopts分解第一個引數,將選項提取出來,然後依次將每個選項(沒有選項前的下劃線“_”)賦值給第二個引數,第二個引數的變數名由使用者賦予。只要選項仍然在處理

getopts很返回0。但是當它處理完所有選項和引數後他返回1,這使得getopts很適合配合while迴圈來處理命令列引數

獲取UNIX型別的選項:   unix有一個優點就是標準UNIX命令在執行時都具有相同的命令列格式:   command -options parameters   如果在執行Shell程式也採用上述格式,Bourne Shell中提供了一條獲取和處理命令列選項的語句,即getopts語句。該語句的格式為:   getopts option_string variable   其中option_string中包含一個有效的單字元選項。若getopts命令在命令列中發現了連字元,那麼它將用連字元後面的字元同option_string相比較。若有匹配,則把變數variable的值設為該選項。若無匹配,則variable設為?。當getopts發現連字元後面沒有字元,會返回一個非零的狀態值。Shell程式中可以利用getopts的返回值建立一個迴圈。   下面程式碼說明了date命令中怎麼使用getopts命令處理各種選項,該程式除了完成unix的標準命令date的功能外,還增加了許多新的選項。 
  #新date程式 
  if [ $# -lt 1 ] 
  then 
    date 
  else 
    while getopts mdyDHMSTJjwahr OPTION 
    do 
      case $OPTION 
      in 
        m)date '+%m';; 
        d)date '+%d';; 
        y)date '+%y';; 
        D)date '+%D';; 
        H0date '+%H';; 
        M)date '+%M';; 
        S)date '+%S';; 
        T)date '+%T';; 
        j)date '+%j';; 
        J)date '+%y%j';; 
        w)date '+%w';; 
        a)date '+%a';; 
        h)date '+%h';; 
        r)date '+%r';; 
        \?)echo "無效的選項!$OPTION";; 
      esac 
    done 
  fi 有時侯選項中還帶一個值,getopts命令同樣也支援這一功能。這時需要在option_string中選項字母后加一個冒號。當getopts命令發現冒號後,會從命令列該選項後讀取該值。若該值存在,那麼將被存在一個特殊的變數OPTARG中。如果該值不存在,getopts命令將在OPTARG中存放一個問號,並且在標準錯誤輸出上顯示一條訊息。   下面的例子,實現拷貝一個檔案,並給檔案賦一個新的名字。-c選項指定程式拷貝的次數,-v選項要求顯示新建立檔案的檔名。   #--拷貝程式   COPIES=1 
  VERBOSE=N 
  while getopts vc:OPTION 
  do 
    case $OPTION 
    in 
      c)COPIES=$OPTARG;; 
      v)VERBOSE=Y;; 
      \?)echo "無效引數!" 
        exit 1;; 
    esac 
  done 
  if [ $OPTIND -gt $# ] 
  then 
    echo "No file name specified" 
     exit 2 
  fi 
  shift 'expr $OPTIND - 1' 
  FILE=$1 
  COPY=0 
  while [ $COPIES -gt $COPY ] 
  do 
    COPY='expr $COPY + 1' 
    cp $FILE $ {FILE} $ {COPY} 
    if [ VERBOSE = Y } 
    then 
      echo ${FILE} $ {COPY} 
    fi 
  done