如果声明未遵守其条件(If statement is not following its condi

2019-08-02 12:11发布

在我的代码滚你只写R并按下回车键,但它似乎没有阅读并转到其他事物重新启动while循环。 得到它推出的唯一方法是通过键入的东西大于r其他比它是一个(standard_in)1:解析错误。

#!/bin/bash
#this is a game that is two player and it is a race to get to 
#100 before the other player

echo "Player 1 name?"
read p1
echo "Player 2 name?"
read p2
echo "Okay $p1 and $p2. $p1 will go first"
p1s=0
p2s=0
pt=1
while [ $pt -eq 1 ]; do
echo "roll or stay"
read choice
if [ $choice == r ]; then

die=$(($RANDOM%6+1))

elif [ $die -eq 1 ]; then
p1s=$(echo "$p1s-$count" |bc)
echo "You rolled a 1. Your score is $p1s"
echo "$p2 turn now."
sleep 1
count=0
pt=2

elif [ $die -gt 1 ]; then
p1s=$(echo "$p1s+$die" |bc)
count=$(echo "$count+$die" |bc)
echo "You rolled a $die. Your score is $p1s"
pt=1

else

if [ $choice == s ]; then
echo "Okay $p1 your score is $p1s"
echo "$p2 turn now"
sleep 1
count=0
pt=2

else
if [ $p1s -gt 99 ]; then
echo "$p1 won. $p2 lost"
echo "would you like to play again?"
read again
elif [ $again  yes ]; then
echo "Okay one second."
sleep 1
clear
bash num.sh
elif [ $again == no ]; then
exit

else

pt=1
fi
fi
fi

done

不要担心自己不会是第二,而第二的球员。 我砍了这一点,因为它完全相同的代码只是供玩家两项。

样品输入/输出

Player 1 name?
guy1
Player 2 name?
guy2
Okay guy1 and guy2. guy1 will go first
roll or stay
r
roll or stay
rr
(standard_in) 1: parse error
You rolled a 5. Your score is 5
roll or stay
roll
(standard_in) 1: parse error
You rolled a 5. Your score is 10
roll or stay
s
(standard_in) 1: parse error
You rolled a 5. Your score is 15
roll or stay

Answer 1:

看正确缩进代码(见后ghoti的重写代码段),我看到了顶层,如果块是

if [ $choice == r ]; then
    die=... #roll the die
elif [ $die -eq 1 ]...
elif [ $die -gt 1 ]...
else
    do something...
fi

问题是,如果[ $choice == r ]是真实的,你将推出的芯片,并跳过其余elif - else项。 所以,你将进入下一个迭代,而无需做任何事情(除了摇动骰子)

解决这个问题的方法之一是检查$choice$die作为独立的if块,即

if [ $choice == r ]; then
    #roll the die
else
    #break or something...
fi

if [ $die -eq 1 ]; then
    #do something
elif the rest of $die-related checks  


Answer 2:

好了,关于代码的一些意见。

  • 这是真的很难,因为缺乏缩进的阅读。 当嵌套的东西,什么缩进嵌套。 随着缩进,你可以看到你的循环开始和结束的,什么样的代码所属的if / else等等。
  • 在bash,你应该总是给你的变量,以避免意外扩大。 例如,如果有人进入一个星号(会发生什么* ),而不是一个“R”? 你if语句会做奇妙而神秘的东西。
  • 您使用的运营商错了。 在bash中,使用单方括号if你比较单一等于(字符串等价= ),而不是增加一倍。 如果你想要的数值相等,你有-eq 。 虽然你可能想看看bash的扩展测试,使用双括号。 (详情请查阅手册页。)
  • 尽量不要使用外部工具的事情上的bash可以自己做。 bc ,例如,不需要用于整数运算。

所以......所有说,这里是你的代码段,重新编写了一下。

while [ "$pt" -eq 1 ]; do

    read -p "Roll or stay (r/s)? " choice

    if [ "$choice" = r ]; then

        die=$(($RANDOM%6+1))

    elif [ "$die" -eq 1 ]; then

        p1s=$((p1s - count))
        echo "You rolled a 1. Your score is $p1s"
        echo "$p2 turn now."
        sleep 1 
        count=0 
        pt=2    

    elif [ $die -gt 1 ]; then

        p1s=$((p1s + die))
        count=$((count + die))
        echo "You rolled a $die. Your score is $p1s"
        pt=1    

    else

请注意,我不是在你的程序逻辑是否健全任何索赔。

而到底是什么num.sh ? 那很重要么?



文章来源: If statement is not following its conditional
标签: bash shell