2014-01-14 31 views
0

我寫了下面的shell腳本來解析參數和打印。它不按預期工作。我相信我沒有將正確的論點傳遞給評估可選參數的函數。可有一個人請幫忙批改它讓getopts在bash腳本中的獨立函數中

#! /bin/sh 

MAX_NO_OF_DATABASE=500; 
MAX_NO_OF_CONCURRENT_REQUEST=500; 
MAX_NO_OF_REQUEST=500; 


function showUsage(){ 
    echo "Sample Usage : ./benchmarking.sh <CORE_URL> <SYNC_SERVER_URL> [-d MAX_NO_OF_DATABASE] [-c MAX_NO_OF_CONCURRENT_REQUEST] [-n MAX_NO_OF_REQUEST]"; 
    exit; 
} 

function readArguements(){ 

    # Check for core url 
    if [ -z $1 ]; then 
      echo "CORE_URL is not specified" 
      showUsage 
    fi 

    # Check for sync server url 
    if [ -z $2 ]; then 
      echo "SYNC_SERVER_URL is not specified" 
      showUsage 
    fi 

} 
function readOptionalArguements(){ 

    # Check for the optional parameters 
    while getopts dcn: opt 
    do 
      case $opt in 
        d) MAX_NO_OF_DATABASE="$OPTARG";; 
        c) MAX_NO_OF_CONCURRENT_REQUEST="$OPTARG";; 
        n) MAX_NO_OF_REQUEST="$OPTARG";; 
      esac 
    done 
} 

readArguements $* 
readOptionalArguements $* 
echo "$1 $2 $MAX_NO_OF_DATABASE $MAX_NO_OF_CONCURRENT_REQUEST $MAX_NO_OF_REQUEST" 

當我運行它./benchmarker.sh core_url sync_url -d 500 -c 100 -n 200

它打印爲 core_url sync_url 500 500 500

我已經調試上,我可以看到,它不評估開關塊。我是否傳遞正確的參數readOptionalArguements

+0

是不是'getopts的d:C:N:opt'? – PeterMmm

+0

@PeterMmm:沒有用 –

+0

彼得是對的,不過。它應該是'getopts d:c:n:'。 –

回答

2

您應該將字符串設置爲d:c:n:,因爲所有三個選項都帶參數。

仔細看了一下man bash說,關於getopts的:

當遇到選項結束,getopts的退出,並大於零的回報 值。 OPTIND設置爲第一個非 選項參數的索引,並且名稱設置爲?。

因此,在處理選項之前,您必須先處理前兩個非選項參數。

core_url=$1 
sync_server=$2 
shift 2 

readArguements "[email protected]" 
readOptionalArguements "[email protected]" 

另外,如果你使用bash,不寫在家當線#!/bin/sh

+0

感謝它的工作! –

2

getopts停止的第一個非選項參數,所以你需要getopts使用前轉移淘汰這些非選項參數。

因此,例如:

function readOptionalArguements(){ 
    # skip two mandatory arguments 
    shift 2 
    # Check for the optional parameters 
    while getopts d:c:n: opt 
    do 
      case $opt in 
        d) MAX_NO_OF_DATABASE="$OPTARG";; 
        c) MAX_NO_OF_CONCURRENT_REQUEST="$OPTARG";; 
        n) MAX_NO_OF_REQUEST="$OPTARG";; 
      esac 
    done 
} 

此外,你應該申報local OPTIND保持該變量的情況下,你多次調用該函數是安全的。

+0

感謝它的工作! –

0

我相信,問題可能是在readOptionalArguments方法(順便說一句,這是在你的問題拼寫錯誤)。以下似乎爲我工作(在bash)

function readOptionalArguements() { 
# Check for the optional parameters 
while getopt "d:c:n:" $* 
do 
echo "opt: <$1>"; 
     case $1 in 
       -d) shift; MAX_NO_OF_DATABASE="$1"; shift;; 
       -c) shift; MAX_NO_OF_CONCURRENT_REQUEST="$1"; shift;; 
       -n) shift; MAX_NO_OF_REQUEST="$1"; shift;; 
     --) break;; 
     *) break;; 
     esac 
done 

}