Shell脚本语法错误

时间:2014-05-02 01:21:21

标签: bash shell variables syntax

目前我正在使用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在脚本运行之前设置。 希望我已经给出了足够的细节并将其格式化,首先是正确的帖子,所以如果没有我就道歉!

1 个答案:

答案 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" ]]