Bash模拟股市脚本中带超时的单字符输入问题求助
解决Bash股市模拟脚本的循环与输入问题
嘿,我来帮你看看这个脚本的问题~你的需求很清晰,但代码里有几个Bash语法细节没处理好,导致无法正常运行,咱们一步步来修正:
先梳理你的代码里的问题点:
while true do语法错误:while循环的do前面需要加分号或者换行分隔,Bash没法识别连在一起的true do- 条件判断
[ $option -ge 0 && $option -le 9 ]有问题:[ ](test命令)里不能直接用&&,得换成-a;另外如果read超时,$option会是空值,直接用数字比较会报错,得先判断输入是否存在 - 缺少对
read超时情况的处理:超时后read会返回非0状态码,咱们可以利用这个避免空值报错
修正后的完整代码:
while true; do menu # 假设这是你定义的菜单展示函数 printValues # 打印股市数据的函数 frames=$((frames + 1)) # 读取输入,同时捕捉read的执行状态 read -t 5 -n 1 option if [ $? -eq 0 ]; then # 只有用户在5秒内输入了内容,才继续判断有效性 if [[ "$option" =~ ^[0-9]$ ]]; then # 用正则直观判断是否为1位数字 buyMenu fi fi clear done
关键修改说明:
- 循环语法修正:把
while true do改成while true; do,用分号分隔true和do,符合Bash的语法要求 - 输入有效性判断优化:
- 先通过
$?判断read是否成功(用户在超时前完成输入),避免超时后空值导致的比较错误 - 用
[[ "$option" =~ ^[0-9]$ ]]的正则判断,比数字区间比较更直观可靠,能准确匹配1位数字输入
- 先通过
- 代码可读性提升:增加换行和缩进,让逻辑分层更清晰
另外补充个小提示:如果menu、printValues、buyMenu这些是你还没定义的函数,记得在脚本开头先完成函数定义哦~
内容的提问来源于stack exchange,提问作者Rodrigo Pinto
相关产品推荐
相关产品推荐

