Bash - 标志不是用于查找文件证据的设置

时间:2013-01-14 14:29:55

标签: bash shell grep

我知道这必须简单,但我只是没有看到它。我们有一个文件SpeakerList.txt,其中包含我们数据库中一系列扬声器的单行。 new.trs包含数据库的空格分隔版本。我需要验证我们是否在数据库中找到了发言者,因此我正在为以发言人姓名开头的行运行grep。以下代码始终会在每个发言者的最后触发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

1 个答案:

答案 0 :(得分:3)

您正在子shell中设置speakerFound变量。阅读this link了解更多详情,但一般情况下:

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

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