1

我知道这一定很简单,但我只是没有看到它。我们有一个文件 ,SpeakerList.txt其中包含我们数据库中的一系列单行扬声器。new.trs保存以空格分隔的数据库版本。我需要验证我们是否在数据库中找到了发言者,因此我正在运行以grep发言者名称开头的 for 行。以下代码始终会导致if每个发言者最后触发的语句。我有一段类似的代码可以检查文件是否存在,它工作得很好。我错过了什么?我知道我的循环正在运行——我已经用调试线grep试过了。echo我还尝试打印出该$speakerFound字段并验证它最后确实是空白的,即使我有一个声明显示它被标记为“找到”

for i in `cat SpeakerList.txt`
do 
  speakerFound="" 
  echo "Speaker: $i"
  grep "^$i" ~/work/new.trs | while read line
  do 
    fileName=`echo $line | cut -d' ' -f 2`
    speakerFound="found"
    break
  done

  if [ "$speakerFound" == "" ]; then
    echo "$i not found in database."
  fi
done
4

1 回答 1

3

您正在speakerFound子外壳中设置变量。阅读此链接以获取更多详细信息,但总的来说:

  • 当您stdin在 bash 中重定向循环时,循环将在子 shell 中执行。
  • 因为循环是一个子shell,循环内的变量赋值在循环外是不可见的。

一种解决方案是使用磁盘上的文件来包含结果(将其写入内部循环,并在需要结果时将其读回)。

于 2013-01-14T14:36:00.303 回答