2017-04-26 41 views
1

]中[[$ answer -eq“mercy”]]的“期望整数表达式”试图编写脚本来玩猜谜游戏。该脚本应该生成一个数字并要求用户猜测。然后脚本会将用户输入的数字与生成的数字进行比较,它应确保游戏继续进行,直到用户乞求怜悯或正确猜测数字为止。它应该向用户提供更高或更低的帮助。一旦发生胜利条件之一,用户应该以某种方式表示祝贺,然后脚本应该结束。如果用户乞求怜悯,它应该回应出一个不同的短语。在[bash

#!/bin/sh 

number="$(((RANDOM % 100) + 1))" 

echo "Guess a number between 1 and 100, or say 'mercy'" 
read answer 
until [[ $answer -eq $number || $answer -eq "mercy" ]] 
do 
    if [ $answer -lt $number ] 
    then 
     echo "Guess higher" 
     read answer 
    else 
     echo "Guess lower" 
     read answer 
    fi 
done 

if [ $answer -eq "mercy" ] 
then 
    echo "You are a quitter" 
else 
    echo "CONGRATS" 
fi 

它让只说恭喜你每次与错误代码一起猜对了或者说怜悯时间:line 19: [: mercy: integer expression expected

回答

1

您的字符串比较使用-eq; -eq是为整数比较 - 您需要使用===。这就是你得到错误的原因。

此外,/bin/sh不一定是bash。因此,使用#!/bin/bash作为shebang

#!/bin/bash 

number="$(((RANDOM % 100) + 1))" 

echo "Guess a number between 1 and 100, or say 'mercy'" 
read answer 
until [[ $answer -eq $number || $answer == "mercy" ]] 
do 
    if [[ $answer -lt $number ]] 
    then 
     echo "Guess higher" 
     read answer 
    else 
     echo "Guess lower" 
     read answer 
    fi 
done 

if [[ $answer == "mercy" ]] 
then 
    echo "You are a quitter" 
else 
    echo "CONGRATS" 
fi 

除非你打算端口这个脚本到其他POSIX贝壳,我建议使用[[ .. ]][ .. ]。见What is the difference between test, [ and [[ ?

+1

更好的做法是使用'='比''==:一是要记住少东西bash和POSIX SH之间切换时发生改变。 –

0

我会使用类似:

#!/bin/bash 

number="$(((RANDOM % 100) + 1))" 

steps=0 
while : 
do 
    read -r -p "Guess a number between 1 and 100, or say 'mercy'> " answer 
    case "${answer,,}" in 
     [0-9]|[0-9][0-9]) let steps++ ;; 
     mercy) echo "Quitter after $steps steps" ; exit 0;; 
     *) echo "Don't understand the $answer" ; continue ;; 
    esac 

    case 1 in 
    $((answer < number))) echo "Guess higher" ;; 
    $((answer > number))) echo "Guess lower" ;; 
    $((answer == number))) echo "winner in $steps steps" ; exit ;; 
    esac 
done