在参数中设置变量时出现错误。
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”。
第一次循环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”。此时,原本应该为值的“1”matchid
已全部下移至$2
,因此您需要将其赋给变量matchid
。
然后它会shift
再执行两次,从列表中删除最后的参数。此时,、$1
等$2
都未赋值,因此[ $# -gt 0 ]
为 false,循环退出。