在bash脚本中使用单独的函数进行getopts

时间:2014-01-14 08:52:17

标签: bash shell unix

我编写了以下shell脚本来解析参数并打印。它没有按预期工作。我确信我没有将正确的参数传递给评估可选参数的函数。有人可以帮忙纠正吗

#! /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

3 个答案:

答案 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以保证该变量的安全。

答案 1 :(得分:2)

您应该将字符串设置为d:c:n:,因为所有三个选项都需要参数。

仔细阅读man bash关于getopts的内容:

  

当遇到选项结束时,getopts退出并返回     值大于零。 OPTIND设置为第一个非索引     选项参数,名称设置为?。

因此,您必须在处理选项之前处理前两个非选项参数。

core_url=$1
sync_server=$2
shift 2

readArguements "$@"
readOptionalArguements "$@"

此外,如果您使用的是bash,请不要在shebang行中写下#!/bin/sh

答案 2 :(得分: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

}