检查 bash 脚本中未回答的问题

问题描述 投票:0回答:1

我正在尝试编写一个 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"

使用测试文档,这确实会返回我可以验证未回答的答案,但它会返回其他误报,其中的问题后面有答案(并且不会返回其他也有答案的问题)。如何改进我的脚本以获得所需的行为?

bash algorithm text document
1个回答
0
投票

逐行浏览一个简短的示例文档,并记下循环每次迭代的 $current_line 和 $next_line 。你很快就会发现问题。

当 $skip_question 为 true 时,$current_line 不会前进,现在 $current_line 比 $next_line 落后两行。我认为这不是你想要的。

在每次迭代结束时无条件地将 $current_line 设置为等于 $next_line。您可能根本不需要 $skip_question 标志。

© www.soinside.com 2019 - 2024. All rights reserved.