2015-11-17 70 views
0

我需要修改其中一個腳本。直到現在,它指出,以更新和數據庫的版本,其中本次更新將被應用於bash腳本中的參數和開關

./script.sh version db_name 

2個強制性參數現在我要增加兩個新的可選參數,其實我應該把它切換。這些開關將它擴展到: 1.安裝前停止(或不)我的web服務器 2.安裝一些新的文件到文件系統 這兩個返回值都是bool值。所有細節都在腳本中。 所以我希望是這樣的:

./script.sh version db_name -stopweb -copyfiles 

我想通了getopts的是合適的命令。問題是如何將參數(強制性)和開關(可選)「連接」在一起。我真的無法得到它:( 可不可以給我一些提示請

+1

你可以看看這裏:http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash –

+0

對,它是一個解決方案。但是我的腳本已經被好幾個人使用過(可能還有一些其他的腳本被調用過),所以最好保持前兩個參數不變。對我來說非常重要的是保持前兩個參數不變,並可選擇添加兩個新開關。 – user3863616

+0

然後看看我的答案,它可以讓你做到這一點... –

回答

0

您應該考慮使用getopts下面是我在我的bash腳本使用選項解析的例子:。

TEMP=$(getopt -o dp:v --long dev,publish:,verbose -- "[email protected]") 

# Note the quotes around '$TEMP': they are essential! 
eval set -- "$TEMP" 

#default values 
DEV=0 
VERBOSE= 
while true; do 
    case "$1" in 
     -d | --dev) DEV=1; shift ;; 
     -p | --publish) PUBLISH="$2" ; shift 2;; 
     -v | --verbose) VERBOSE="-v" ; shift ;; 
     --) if [ -n "$2" ] 
      then 
       ARGUMENT1=$2 
       if [ -n "$3" ] 
       then 
        ARGUMENT2=$3 
        if [ -n "$4" ] 
        then 
         shift 3 
         echo "Unexpected options: \"[email protected]\" . exiting." 
         exit 1; 
        fi 
       fi 
      fi 
      shift 2; break;; 
     *) break ;; 
    esac 
done 

# you can add some checks here that ARGUMENT1 and ARGUMENT2 were effectively set, if they are mandatory 

一些特點:

  • 利用短期和長期的選項
  • 一些選項需要一個參數
  • 使用一些可選的申辯發言:(一個在這種情況下),不與-

注意開始:爲了getopts的是能夠區分-dv是兩個短選項和--dev是一個長期的選擇;所有的長期選項應該從兩個連字符開始。

+0

這是使用'getopt(1)'而不是'getopts'(它們是不同的東西),而getopt(1)'支持長選項,很多老版本的'getopt'被打破,包含空格和/或空白。 –

+0

@ user3863616:如果我的回答對您有幫助,請考慮接受它。 –