设置参数时出错

设置参数时出错

在参数中设置变量时出现错误。

while [ $# -gt 0 ] ; do
    case $1 in
       '--pub') fun2exec="loadpubserveripip" ;;
       '--tourney') fun2exec="loadtourneyserver" ;;
       '--standby') fun2exec="loadpubserverwg" ;;
       '--help') fun2exec="help" ;;
       '--port') port="$2" ; shift ;;
       '--matchid') matchid="$3" ; shift ;;
       *) echo "Argument Error, Please type bash script.sh --help for All Available Arguments"; exit 1 ;;
    esac
    shift done

if [ -z "$fun2exec" ] ; then
    help
    exit 2 fi

if [ -z "$port" ] ; then
    echo "Please Provide Server Port 11011/22022/33033/44044/55055"
    exit 3 fi

$fun2exec

exit 0

这是代码的一部分。每当我执行时,我都会得到如下输出

+ '[' 5 -gt 0 ']'
+ case $1 in
+ fun2exec=loadtourneyserver
+ shift
+ '[' 4 -gt 0 ']'
+ case $1 in
+ port=11011
+ shift
+ shift
+ '[' 2 -gt 0 ']'
+ case $1 in
+ matchid=
+ shift
+ shift
+ '[' 0 -gt 0 ']'
+ '[' -z loadtourneyserver ']'
+ '[' -z 11011 ']'
+ '[' -z '' ']'
+ echo 'Please Provide MatchID'
Please Provide MatchID
+ exit 3

我使用以下命令执行脚本

bash -x test.sh --tourney --port 11011 --matchid 1

有人能帮我解决这个问题吗,我对脚本编写还很陌生

答案1

简短回答:使用matchid="$2"而不是matchid="$3"

长答案:我认为你误解了shift$1$2的工作原理。$1$2, 等包含全部传递给脚本的参数,包括“--tourney”和“--port”等标志参数。shift从列表中删除第一个参数,其余参数在列表中向下“移动”,因此原来的变成$2$1原来的变成$3$2等等。

因此在脚本的开头,$1是“--tourney”,$2是“--port”,$3是“11011”,$4是“--matchid”,$5是“1”。

第一次循环whilecase $1匹配“--tourney”,因此设置fun2exec="loadtourneyserver"然后运行shift。所以现在$1是“--port”,$2是“11011”,$3是“--matchid”,$4是“1”。

第二次循环whilecase $1匹配“--port”,因此它设置port="$2"(即“11011”*因为该参数从 移到了$3$2。然后它运行shift 两次,删除前两个参数。所以现在$1是“--matchid”,并且$2是“1”。

第三次循环whilecase $1最终匹配“--matchid”。此时,原本应该为值的“1”matchid已全部下移至$2,因此您需要将其赋给变量matchid

然后它会shift再执行两次,从列表中删除最后的参数。此时,、$1$2都未赋值,因此[ $# -gt 0 ]为 false,循环退出。

相关内容