为什么我从[$ {guess [0]} -eq num]中得到bash整数表达式错误?

时间:2015-04-09 22:27:42

标签: bash

我试图提示用户猜测0-9之间的值。我得到预期的错误整数表达式。我不明白为什么有人能解释我哪里出错了?

num=8

echo "Enter a value between 0-9"
read -a guess

if [ ${guess[0]} -eq num ] ; then
    echo "You guesses the right number"
elif [ ${guess[0]} -gt num ] ; then 
    echo "You guessed too high"
elif [ ${guess[0]} -lt num ] ; then
    echo "You guess too low"
fi

1 个答案:

答案 0 :(得分:2)

仅进行此代码正常运行所需的最小更改次数:

#!/bin/sh

num=8

echo "Enter a value between 0-9"
read guess

if [ "$guess" -eq "$num" ] ; then
    echo "You guesses the right number"
elif [ "$guess" -gt "$num" ] ; then 
    echo "You guessed too high"
elif [ "$guess" -lt "$num" ] ; then
    echo "You guess too low"
fi

注意:

  • 由于您只阅读单个值,因此没有令人信服的理由使用数组 - 同样容易将-a参数取出read;这样做也使您的代码与POSIX sh兼容,因此在所有符合POSIX标准的shell系统上都使用#!/bin/sh
  • 使用test(或[)时,您需要扩展变量。 $num,而不是$num;后者只能在数值上下文中使用,而test与解析器一样是常规命令 - 它不会在语法级别创建任何特殊上下文。
  • 因为[是常规命令,所以在它之后需要空格,就像任何其他命令名一样。
  • 因为[是常规命令,所以在它期望作为最后一个参数的]之前需要空格 - 与将参数传递给其他任何参数时相同。
  • 如果你的shell是bash(你的脚本以#!/bin/bash开头),你可以使用数学上下文:if (( guess == num ))if (( guess > num ))。这个 是一个数学上下文,并且有特殊的解析规则。