Linux中國

Bash Getopts – 讓你的腳本支持命令行參數

bash getopts

開始的時候,我只試著處理傳遞給腳本的命令行參數。最後,我添加了另外一些有用的功能函數,使得這個腳本可以成為其他任何互動式腳本處理命令行的開始模板。我還添加了一個純文本格式的幫助函數,讓腳本更加容易閱讀。

與其來一長段文字解釋 getopts 在bash中是如何工作的,我認為不如直接來一個能工作的腳本更讓人覺得輕鬆一些。

#!/bin/bash

######################################################################
#This is an example of using getopts in Bash. It also contains some
#other bits of code I find useful.
#Author: Linerd
#Website: http://tuxtweaks.com/
#Copyright 2014
#License: Creative Commons Attribution-ShareAlike 4.0
#http://creativecommons.org/licenses/by-sa/4.0/legalcode
######################################################################

#Set Script Name variable
SCRIPT=`basename ${BASH_SOURCE[0]}`

#Initialize variables to default values.
OPT_A=A
OPT_B=B
OPT_C=C
OPT_D=D

#Set fonts for Help.[譯註: 這裡tput用來更改終端文本屬性,比如加粗,高亮等]
NORM=`tput sgr0`
BOLD=`tput bold`
REV=`tput smso`

#Help function
function HELP {
  echo -e \n"Help documentation for ${BOLD}${SCRIPT}.${NORM}"\n
  echo -e "${REV}Basic usage:${NORM} ${BOLD}$SCRIPT file.ext${NORM}"\n
  echo "Command line switches are optional. The following switches are recognized."
  echo "${REV}-a${NORM}  --Sets the value for option ${BOLD}a${NORM}. Default is ${BOLD}A${NORM}."
  echo "${REV}-b${NORM}  --Sets the value for option ${BOLD}b${NORM}. Default is ${BOLD}B${NORM}."
  echo "${REV}-c${NORM}  --Sets the value for option ${BOLD}c${NORM}. Default is ${BOLD}C${NORM}."
  echo "${REV}-d${NORM}  --Sets the value for option ${BOLD}d${NORM}. Default is ${BOLD}D${NORM}."
  echo -e "${REV}-h${NORM}  --Displays this help message. No further functions are performed."\n
  echo -e "Example: ${BOLD}$SCRIPT -a foo -b man -c chu -d bar file.ext${NORM}"\n
  exit 1
}

#Check the number of arguments. If none are passed, print help and exit.
NUMARGS=$#
echo -e \n"Number of arguments: $NUMARGS"
if [ $NUMARGS -eq 0 ]; then
  HELP
fi

### Start getopts code ###

#Parse command line flags
#如果選項需要後跟參數,在選項後面加":"
#注意"-h"選項後面沒有":",因為他不需要參數。選項字元串最開始的":"是用來去掉來自getopts本身的報錯的,同時獲取不能識別的選項。(譯註:如果選項字元串不以":"開頭,發生錯誤(非法的選項或者缺少參數)時,getopts會向錯誤輸出列印錯誤信息;如果以":"開頭,則不會列印[在man中叫slient error reporting],同時將出錯的選項賦給OPTARG變數)

while getopts :a:b:c:d:h FLAG; do
  case $FLAG in
    a)  #set option "a"
      OPT_A=$OPTARG
      echo "-a used: $OPTARG"
      echo "OPT_A = $OPT_A"
      ;;
    b)  #set option "b"
      OPT_B=$OPTARG
      echo "-b used: $OPTARG"
      echo "OPT_B = $OPT_B"
      ;;
    c)  #set option "c"
      OPT_C=$OPTARG
      echo "-c used: $OPTARG"
      echo "OPT_C = $OPT_C"
      ;;
    d)  #set option "d"
      OPT_D=$OPTARG
      echo "-d used: $OPTARG"
      echo "OPT_D = $OPT_D"
      ;;
    h)  #show help
      HELP
      ;;
    ?) #unrecognized option - show help
      echo -e \n"Option -${BOLD}$OPTARG${NORM} not allowed."
      HELP
      #在這裡如果你不想列印完整的幫助信息,只想顯示簡單的錯誤信息,去掉上面的兩行,同時使用下面的兩行。
      #echo -e "Use ${BOLD}$SCRIPT -h${NORM} to see the help documentation."\n
      #exit 2
      ;;
  esac
done

shift $((OPTIND-1))  #This tells getopts to move on to the next argument.

### End getopts code ###

### Main loop to process files ###

#這裡你可以用你的腳本處理邏輯來替代。這個例子只是在終端中列印文件的文件名和後綴名。你可以把任意其他的文件處理任務放到這個while-do循環中。   

while [ $# -ne 0 ]; do
  FILE=$1
  TEMPFILE=`basename $FILE`
  #TEMPFILE="${FILE##*/}"  #另外一種獲取不帶後綴的文件名的方法。
  FILE_BASE=`echo "${TEMPFILE%.*}"`  #file without extension
  FILE_EXT="${TEMPFILE##*.}"  #file extension

  echo -e \n"Input file is: $FILE"
  echo "File withouth extension is: $FILE_BASE"
  echo -e "File extension is: $FILE_EXT"\n
  shift  #Move on to next input file.
done

### End main loop ###

exit 0

將上面的代碼複製到你的文本編輯器里,然後保存到你的可執行路徑下。我將這個腳本命名為 options 並保存到 /home/linerd/bin 路徑下。保存之後記得給你的腳本添加可執行許可權。

chmod +x ~/bin/options

現在腳本已經可以運行了。試試用 -h 參數來列印幫助信息吧。

options -h

遇到不支持的選項,腳本同樣可以給出提示,並列印幫助信息。

options -z

最後,getopts可以以任意的順序處理你給的命令行參數。唯一的限制是你要處理的文件必須放在所有參數的最後。

options -d bar -c chu -b man -a foo example1.txt example2.txt

現在你可以從這些例子里看到如何通過命令行參數給腳本里的變數賦值。這個腳本里除了getopts還有很多其他的東西,但是我認為這些就足以成為一個新腳本的開頭模板了。如果你有興趣更深入地學習bash的getopts,你可以找找深埋在man page的「Builtins」這一節里的文檔,也可以從 Bash Reference Manual 找到信息。

接下來呢?

你會用getops來幹什麼呢?在評論里告訴我吧。

via: http://tuxtweaks.com/2014/05/bash-getopts/

譯者: CNprober <travelwithheart@yeah.net, QQ619913541> 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國