【问题标题】:How to implement a spell checker in random number generator in a Bash script如何在 Bash 脚本中的随机数生成器中实现拼写检查器
【发布时间】:2020-05-12 09:24:47
【问题描述】:

刚刚完成了一个要求用户猜测 1 到 100 之间的数字的数字生成器游戏的脚本,我很好奇是否有办法让脚本只接受 1-100 数字范围之间的数字并拒绝任何字母人物?我尝试使用

typeset -i

但我不确定我是在充分利用它还是遗漏了什么,这是其余的代码

#!/bin/bash
num=$((RANDOM%100))
typeset -i attempts=0
until [[ $guess == $num ]]
do
    echo -n "Enter your guessing number: "
    read -r guess
    if (( guess < num ));
    then echo "Guess Higher..."
    elif (( guess > num ));
    then echo "Guess Lower..."
    fi
(( attempts++ )) 
done
printf "Congradulations! it took $attempts guesses!\n"

【问题讨论】:

  • 你的代码运行了吗?如果输入超出所需范围 (1..100) 的数字会怎样?如果输入非整数(例如,字母或单词)会怎样?
  • 是的,代码按预期运行,如果我输入超出范围的字符或数字,脚本仍然接受它并告诉“猜测更高......”我只需要它拒绝字符或数字范围之外的数字。
  • 我相信typeset -i 只是将任何非整数的后续分配视为0
  • @jhnc :这仅适用于分配带有非数字的字符串。如果我分配一个以数字开头的混合字符串,例如 5Z,我会收到神秘的错误消息 value too great for base 并且变量的值不会改变(即不强制零)。因此,“穷人的检查器”确实是typeset -i guess,在读取之前将变量显式设置为0,然后测试它是否在数字允许的范围内。

标签: linux bash random scripting generator


【解决方案1】:

接受 1-100 范围内的数字并拒绝任何字母字符?

所以使用一些实用程序来检查输入。您可以使用正则表达式检查输入是否仅包含数字,然后检查范围。

echo -n "Enter your guessing number: "
read -r guess
if ! [[ $guess=~ ^[0-9]+$ ]]; then
      echo "Your guess is not a number, try again..."
      continue;
fi
if (( guess < 1 )); then
     echo "Your guess is lower then 1, try again..."

fi
if (( guess > 100 )); then
     echo "Your guess is higher then 100, try again..."
     continue
fi
# rest of your script

你可以使用:

typeset -i guess
read -r guess

但这会将任何输入转换为数字而不进行错误检查。如果输入blablaguess 将只是0,没有错误检查。

【讨论】:

    【解决方案2】:

    我会翻转测试并使用通配符模式(通配符)来检查变量是否包含非法字符:

    if [[ $guess == *[^0-9]* ]]
    then
      echo Value is not an natural number
    elif ((guess == 0 || guess > 100))
      echo Value is out of range
    else
      ... do your game here
    fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 2012-09-05
      相关资源
      最近更新 更多