在参数中设置变量时出现错误。
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
有人可以帮我解决这个问题吗,我对脚本很陌生
简短的回答:使用
matchid="$2"
而不是matchid="$3"
.长答案:我认为您误解了
shift
and$1
,$2
等的工作方式。$1
,$2
等包含传递给脚本的所有参数,包括“--tourney”和“--port”等标志参数。shift
从列表中删除第一个参数,其余参数在列表中“移动”,所以什么$2
变成$1
了,什么$3
变成了$2
,等等。所以在脚本的开头,
$1
是“--tourney”,$2
是“--port”,$3
是“11011”,$4
是“--matchid”,$5
是“1”。第一次通过
while
循环,case $1
匹配“--tourney”,所以它设置fun2exec="loadtourneyserver"
然后运行shift
。所以现在$1
是“--port”,$2
是“11011”,$3
是“--matchid”,$4
是“1”。第二次通过
while
循环,case $1
匹配“--port”,因此它设置port="$2"
(即“11011”*因为该参数已从转移$3
到$2
)。然后它运行shift
两次,删除前两个参数。所以现在$1
是“--matchid”,并且$2
是“1”。第三次
while
循环,case $1
最终匹配“--matchid”。此时应该是matchid
值的“1”一直向下移动到$2
,所以这就是您需要分配给matchid
变量的内容。然后它会再
shift
增加两次,从列表中删除最后一个参数。此时$1
,$2
, 等都未赋值,因此[ $# -gt 0 ]
为 false 并且循环退出。