为Bash猜数字游戏脚本添加错误检查的技术求助
Bash猜数字脚本输入校验修复方案
问题分析
你使用的if [ ! -z "${number_guess##*[!0-9]*}" ]; then校验逻辑本身没问题,但之前的放置位置和嵌套逻辑错误,导致无论输入是否合法都会触发错误提示。另外原脚本直接用-eq比较非数字输入时会报错,必须先完成输入合法性校验再执行核心猜数逻辑。
修复后的完整脚本
#!/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 # 先校验输入是否为纯数字,再判断范围 if [ ! -z "${number_guess##*[!0-9]*}" ]; then # 确认数字在1-10区间内 if [ ${number_guess} -ge ${min_number} ] && [ ${number_guess} -le ${max_number} ]; then 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 else echo "Please enter a valid number" fi else echo "Please enter a valid number" fi exit 0
关键逻辑说明
- 纯数字校验:
${number_guess##*[!0-9]*}是Bash参数扩展语法,作用是移除输入字符串中所有非数字字符。如果处理后的结果不为空(! -z),说明输入全是数字。 - 范围校验:用
-ge(大于等于)和-le(小于等于)组合判断,确保输入数字落在1-10的指定区间内。 - 执行顺序:先验证输入是否为纯数字,再检查数字范围,只有双重校验通过后,才会执行原有的猜数结果判断逻辑。
错误原因解释
你之前出现的全域错误提示,大概率是把校验条件写反(比如误写为if [ -z "${number_guess##*[!0-9]*}" ]; then),或者没有正确嵌套范围校验逻辑,导致合法输入也被判定为非法。
内容的提问来源于stack exchange,提问作者RobbieDCjr
相关产品推荐
相关产品推荐

