目前我正在使用shell脚本进行二十一点游戏。我有大部分脚本使用函数但是我用来查明播放器/计算机是否破灭的方法似乎不起作用。任何人都可以指出我正确的方向。 (我是shell脚本的新手。)运行它时,它会在开始elif的行周围抛出语法错误,有时甚至是。它还会在bustConfirm中打印所有'echo'输出,而不仅仅是真实的输出。
同样是的,我的一个函数叫做bustCheck。
bustConfirm(){
bust='bust'
under='under'
if [ $userBust -eq $bust -a $systemBust -eq $bust ]
then
echo "You both went bust! Be more careful!"
endGameRepeat
elif [ $userBust -eq $bust -a $systemBust -eq $under ]
echo $userName "went bust! Congratulations" $systemName"!"
endGameRepeat
elif [ $userBust -eq $under -a $systemBust -eq $bust ]
then
echo $systemName "went bust! Congratulations" $userName"!"
endGameRepeat
else
echo "Nobody went bust! Well played!"
endGameScores
fi
}
bustCheck(){
if [ "$userScore" -gt 21 ]
then
echo $userName "is bust!"
userBust='bust'
else
userBust='under'
fi
if [ "$systemScore" -gt 21 ]
then
echo $systemName "is bust!"
systemBust='bust'
else
systemBust='under'
fi
bustConfirm
}
我的想法是我想使用&&在bustConfirm函数中然后是||如果只有其中一个人破产,那么让玩家破产或系统是破产的结果。
也只是一个指针但在bustCheck中我看到userBust和systemBust包含单词bust或under。我为bustConfirm函数创建了变量bust和under。
systemScore,userScore,systemName和userName在脚本运行之前设置。 希望我已经给出了足够的细节并将其格式化,首先是正确的帖子,所以如果没有我就道歉!
答案 0 :(得分:2)
快速浏览一下,我看到第一个if
语句在开头方括号后面没有空格。
我还建议您在if
语句中添加变量名称。这是由于shell的实际工作方式。 bash shell非常聪明,在你的程序有机会做任何事情之前,它会抓住线条,发挥它的魔力,然后将线条呈现给处理器。
例如:
foo=""
if [ $foo = "" ]
then
echo "Foo is blank"
fi
看起来很简单。但是,发生的情况是你的shell将获取该行,用$foo
的值替换字符串“$ foo”,然后执行该行。由于$foo
为空,您的if
语句将变为:
if [ = "" ] # That's not right!
then
echo "Foo is blank"
fi
使用引号,这个:
foo=""
if [ "$foo" = "" ]
then
echo "Foo is blank"
fi
变为:
foo=""
if [ "" = "" ]
then
echo "Foo is blank"
fi
这是有效的。您可以做的另一件事是使用使用双方括号的 new 测试格式:
foo=""
if [[ $foo = "" ]]
then
echo "Foo is blank"
fi
即使没有额外的引号,这也总是有效,现在建议使用,除非你必须让你的程序与原始的Bourne shell语法兼容。
调试shell脚本可以做的另一件事是使用set -xv
打开详细调试。每个语句在执行之前都会打印出来,然后在shell填充变量,模式等后再次打印,然后执行。这是调试程序的好方法。在您想要这个详细的调试模式之前,只需将set -xv
放在行上,然后使用set +xv
将其关闭。 (是的,-
将其打开,+
将其关闭。)
非常感谢大卫,很棒的回答,你能告诉我什么是最好的方式来获得&&或者相当于它,因为我需要找出它们是否是胸围,或者只是一个等等
正如评论中已经提到的,您可以使用以下两种形式之一:
if [ "$foo" = "bar" ] && [ "$bar" = "foo" ]
或
if [[ $foo = "bar" && $bar = "foo" ]]