2014-01-14 30 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 

}