我不得不在一个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,但我不能弄清楚。我确实设法让它回显了,但它会这样做,无论输入的数字,所以我不知道。我不想找人帮我做,但如果能给我解释或任何帮助,我将不胜感激。
2条答案
按热度按时间kxkpmulp1#
好吧,但是有太多的话要说,here there's reviewed code以一种现代的Bash-y方式,以一种更可靠和健壮的方式清理输入(请随意阅读,我使用最佳bash实践),但这里是。..
建议x1c 0d1x
Best practice for sanitizing user input in arithmetic
避免算术表达式中的shell注入
在这里询问之前,总是首先测试你的脚本到https://shellcheck.net。它可以在没有人类帮助的情况下向你展示一些陷阱
$[...]
是一个过时的数学语法。不要用它。使用
$((...))
代替。((...))
和$((...))
是算术命令,如果表达式为非零,则返回退出状态0,如果表达式为零,则返回退出状态1。如果需要副作用(赋值),也用作“let”的同义词。参见http://mywiki.wooledge.org/ArithmeticExpression[[
是一个bash关键字,类似于[
命令(但更强大)。参见http://mywiki.wooledge.org/BashFAQ/031和http://mywiki.wooledge.org/BashGuide/TestsAndConditionals。除非你是为POSIX sh编写的,否则我推荐[[
ikfrs5lh2#
建议的代码片段。..
...在处理像
1a3
或123_789
这样的字符串时有一些问题;* 提示 *:尝试分配不同的字符串,然后运行echo "${number_guess##*[!0-9]*}"
,看看这个替换的行为。我可能会选择一些更冗长的东西,例如:
然后,为了尽量减少对当前脚本的更改,我可能会将其集成到当前的
if/else
块中,例如:**注:**如Gilles' answer中所述,
$[ ... ]
是一种过时的数学形式;我将把这个问题留给你和你的导师来决定是否/如何进行