Shell脚本Yes/No循环交互功能实现求助(脚本新手)
帮你修复Yes/No询问的Shell脚本
嘿,别担心!作为Shell脚本新手,语法细节确实容易搞混,我帮你把这个脚本理顺,先说说你原来代码里的问题,再给你正确的实现~
你原代码里的主要问题
read命令没有把用户输入存储到变量里,应该写成read -p "问题内容" 变量名,你漏了给RESP变量赋值- if语句语法错误:条件判断需要用
$取变量值(比如"$RESP"而不是"RESP"),而且if/else的结构完全混乱,没有正确的闭合和逻辑分支 - 循环部分逻辑错误:变量初始化、递增方式(Shell里不能直接
count++,要写成count=$((count + 1)))和循环条件都不对 - 字符串比较时没有考虑大小写问题,用户输入
Yes/YES会匹配失败
正确的脚本实现
这个脚本会完美实现你的需求:第一次询问,回答Yes就输出回复;回答No就重复询问4次(加上第一次总共5次),输入无效会提示重新回答:
# 初始化计数器和最大尝试次数(包括第一次,总共5次) count=0 max_tries=5 while [ $count -lt $max_tries ]; do # 询问用户并存储输入到RESP变量 read -p "Would you like a cup of tea? (Yes/No) " RESP # 把输入转成小写,兼容大小写输入(Yes/YES/yes都能匹配) RESP=$(echo "$RESP" | tr '[:upper:]' '[:lower:]') if [ "$RESP" = "yes" ]; then echo "Great! I will make you a cup of tea!" exit 0 # 回答Yes后直接退出脚本 elif [ "$RESP" = "no" ]; then # 如果不是最后一次询问,提示确认 if [ $count -lt $((max_tries - 1)) ]; then echo "Are you sure you won't have a cup of tea?" fi count=$((count + 1)) # 计数器加1 else # 输入无效时提示,不增加计数器 echo "Oops, please answer with Yes or No!" fi done # 如果5次都回答No,输出最终提示 echo "Alright, no tea for you then!"
脚本逐行解释
- 计数器初始化:
count=0记录当前询问次数,max_tries=5设置总共询问5次(第一次+4次重复) - 循环控制:
while [ $count -lt $max_tries ]确保只要没到最大次数就继续询问 - 读取用户输入:
read -p "..." RESP把用户的回答存在RESP变量里 - 大小写兼容:用
tr命令把输入转成小写,避免因为大小写导致匹配失败 - Yes分支:匹配到yes就输出回复,用
exit 0退出脚本,不再继续询问 - No分支:如果是最后一次询问就不提示确认,否则提示,然后计数器加1
- 无效输入分支:提示用户输入正确选项,不增加计数器,重新询问
- 循环结束:如果5次都回答No,输出最终的提示
内容的提问来源于stack exchange,提问作者 mary
相关产品推荐
相关产品推荐

