我编写了以下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
答案 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
}