优化Bash脚本:解决未回答问题扫描的假阳性问题
改进Bash脚本识别未回答问题的方案
原脚本的核心问题出在状态处理逻辑和匹配规则上,导致已回答问题被误判、部分回答未被正确跳过,以下是修正方案:
原脚本的问题分析
skip_question状态重置时机错误,易引发后续行处理混乱- 问题行匹配规则
"* "*过于死板,无法兼容带前导空格的单个星号行 - 未处理文件末尾的孤立问题行(最后一行是问题且无后续内容时,无法被判定为未回答)
修正后的脚本
#!/bin/bash if [ $# -ne 1 ]; then echo "Usage: $0 <document>" exit 1 fi document="$1" current_question="" while IFS= read -r line; do # 先处理上一行遗留的待检查问题 if [ -n "$current_question" ]; then # 判断当前行是否为两个及以上星号开头(允许前导空格) if [[ "$line" =~ ^[[:space:]]*\*\*+ ]]; then # 是回答,清空问题变量,跳过后续处理 current_question="" continue else # 不是回答,输出未回答问题 echo "Unanswered Question: $current_question" current_question="" fi fi # 检查当前行是否为单个星号开头的问题(允许前导空格,星号后无其他星号) if [[ "$line" =~ ^[[:space:]]*\*[^*] ]]; then # 提取星号后的问题内容(去除前导空格、星号及星号后的空格) current_question="${line#*[[:space:]]*[*][[:space:]]}" fi done < "$document" # 处理文件末尾遗留的未回答问题 if [ -n "$current_question" ]; then echo "Unanswered Question: $current_question" fi
关键改进点
- 状态管理简化:用
current_question直接持有待检查的问题内容,替代原有的skip_question状态,逻辑更直观 - 匹配规则严谨化:
- 问题行:兼容带前导空格的情况,且确保星号后无其他星号(避免把回答行误判为问题)
- 回答行:兼容带前导空格的情况,只要以两个及以上星号开头即判定为回答
- 新增末尾处理:循环结束后检查是否有未处理的问题,避免遗漏文件最后一行的未回答问题
- 逻辑顺序调整:优先处理上一行遗留的问题,再检查当前行是否为新问题,避免状态冲突
内容的提问来源于stack exchange,提问作者Tartan_Spartan
相关产品推荐
相关产品推荐

