在Bash Shell脚本数字猜猜游戏中添加错误检查

rnmwe5a2  于 2023-05-01  发布在  Shell
关注(0)|答案(2)|浏览(89)

我不得不在一个bashshell脚本中为我的Linux类创建一个猜数字游戏,这并不太难。现在,我必须更新脚本来 Package 现有的if块,以便它“当且仅当一个数值存在时”运行,但我不知道如何做到这一点。这是我第一次不得不做脚本,所以我绝对是个新手。

#!/bin/bash

min_number=1
max_number=10

my_number=$[ $RANDOM % ${max_number} + ${min_number} ]

echo -n "Guess a number between ${min_number} and ${max_number}: "
read number_guess

echo "My number is ${my_number}. You guessed ${number_guess}."

if [ ${number_guess} -eq ${my_number} ]; then
  echo "Congratulations! You guessed correctly!"
    else
      echo "Sorry, better luck next time!"
fi
exit 0

说明书上写着:* 测试不呈现输入并且不是数字可能看起来像这样:*
if [ ! -z "${number_guess##*[!0-9]*}" ]; then
但我不知道该把它放在代码的什么地方才能和其他部分一起工作。我已经把它折腾了好几个小时了,我确信解决方案非常简单,但我不能让它做我想做的事情。我试着让它回显“请输入一个有效的数字”,当它是一个字母或一个数字不是1-10,但我不能弄清楚。我确实设法让它回显了,但它会这样做,无论输入的数字,所以我不知道。我不想找人帮我做,但如果能给我解释或任何帮助,我将不胜感激。

kxkpmulp

kxkpmulp1#

  • 我不想找人帮我做,但如果你能给我一个解释或任何帮助,我将不胜感激 *

好吧,但是有太多的话要说,here there's reviewed code以一种现代的Bash-y方式,以一种更可靠和健壮的方式清理输入(请随意阅读,我使用最佳bash实践),但这里是。..

建议x1c 0d1x

Best practice for sanitizing user input in arithmetic

# POSIX
case $var in
    '' | *[!0123456789]*)
        printf '%s\n' "$0: $var: invalid digit" >&2; exit 1;;
esac

避免算术表达式中的shell注入
在这里询问之前,总是首先测试你的脚本到https://shellcheck.net。它可以在没有人类帮助的情况下向你展示一些陷阱


$[...]是一个过时的数学语法。不要用它
使用$((...))代替。
((...))$((...))是算术命令,如果表达式为非零,则返回退出状态0,如果表达式为零,则返回退出状态1。如果需要副作用(赋值),也用作“let”的同义词。参见http://mywiki.wooledge.org/ArithmeticExpression
[[是一个bash关键字,类似于[命令(但更强大)。参见http://mywiki.wooledge.org/BashFAQ/031http://mywiki.wooledge.org/BashGuide/TestsAndConditionals。除非你是为POSIX sh编写的,否则我推荐[[

ikfrs5lh

ikfrs5lh2#

建议的代码片段。..

if [ ! -z "${number_guess##*[!0-9]*}" ]; then

...在处理像1a3123_789这样的字符串时有一些问题;* 提示 *:尝试分配不同的字符串,然后运行echo "${number_guess##*[!0-9]*}",看看这个替换的行为。
我可能会选择一些更冗长的东西,例如:

# one of the following to strip out all non-numerics:

stripped="${number_guess//[!0-9]}"
stripped="${number_guess//[^0-9]}"

# plus one of the following to test for empty/no-response or a string that contains something other than numerics:

if [  -z "${stripped}" -o "${number_guess}" != "${stripped}"  ]; then
if [[ -z "${stripped}" || "${number_guess}" != "${stripped}" ]]; then

然后,为了尽量减少对当前脚本的更改,我可能会将其集成到当前的if/else块中,例如:

stripped="${number_guess//[^0-9]}"

if [[ -z "${stripped}" || "${number_guess}" != "${stripped}" ]]; then
  echo "ERROR: Your guess ($number_guess) is not a valid number"
elif [ ${number_guess} -eq ${my_number} ]; then
  echo "Congratulations! You guessed correctly!"
else
  echo "Sorry, better luck next time!"
fi

**注:**如Gilles' answer中所述,$[ ... ]是一种过时的数学形式;我将把这个问题留给你和你的导师来决定是否/如何进行

相关问题