我正在尝试编写一个 bash 脚本来扫描未解答的问题。它以文档作为参数,然后扫描当前行上以单个星号(这代表一个问题)开头的文本。然后它会在这样的问题之后扫描下一行。如果它在下一行的开头发现两个或多个星号(这代表一个答案),它应该忽略问题和答案,但如果它在下一行找到另一个以单个星号开头的文本字符串(或者如果它在下一行的开头没有找到星号),它应该打印当前行第一个星号后面的文本(这代表一个未回答的问题)。
我到目前为止的算法是:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <document>"
exit 1
fi
document="$1"
current_line=""
skip_question=false
while IFS= read -r next_line; do
if [[ "$current_line" == "* "* ]]; then
if [[ "$next_line" == "**"* ]]; then
skip_question=true
elif [[ "$next_line" == "" || "$next_line" == "*"* ]]; then
echo "Unanswered Question: ${current_line#* }"
fi
fi
if [ "$skip_question" = false ]; then
current_line="$next_line"
else
skip_question=false
fi
done < "$document"
使用测试文档,这确实会返回我可以验证未回答的答案,但它会返回其他误报,其中的问题后面有答案(并且不会返回其他也有答案的问题)。如何改进我的脚本以获得所需的行为?
逐行浏览一个简短的示例文档,并记下循环每次迭代的 $current_line 和 $next_line 。你很快就会发现问题。
当 $skip_question 为 true 时,$current_line 不会前进,现在 $current_line 比 $next_line 落后两行。我认为这不是你想要的。
在每次迭代结束时无条件地将 $current_line 设置为等于 $next_line。您可能根本不需要 $skip_question 标志。