Bash-flag未设置为查找文件的证据

Bash-flag未设置为查找文件的证据,bash,shell,grep,Bash,Shell,Grep,我知道这一定很简单,但我就是看不到。我们有一个文件,SpeakerList.txt,它在我们的数据库中包含一个扬声器的一系列单行new.trs保存以空格分隔的数据库版本。我需要验证我们是否在数据库中找到了说话人,因此我正在对以说话人姓名开头的行运行grep。以下代码始终会导致每个说话人在结束时触发if语句。我有一段类似的代码,可以检查文件是否存在,并且工作正常。我错过了什么?我知道我的grep循环正在运行——我已经用debugecho行尝试过了。我还尝试打印出$speakerFound字段,并验

我知道这一定很简单,但我就是看不到。我们有一个文件,
SpeakerList.txt
,它在我们的数据库中包含一个扬声器的一系列单行
new.trs
保存以空格分隔的数据库版本。我需要验证我们是否在数据库中找到了说话人,因此我正在对以说话人姓名开头的行运行
grep
。以下代码始终会导致每个说话人在结束时触发
if
语句。我有一段类似的代码,可以检查文件是否存在,并且工作正常。我错过了什么?我知道我的
grep
循环正在运行——我已经用debug
echo
行尝试过了。我还尝试打印出
$speakerFound
字段,并验证它在结尾处确实是空的,即使我有一条语句显示它在前面被标记为“found”


您正在子shell中设置
speakerFound
变量。阅读更多详细信息,但一般而言:

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

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

或者将检查移动到函数中,然后使用
return
设置退出代码,然后可以检查。我假设OP需要的不仅仅是结果代码……但如果是这样,您不需要将支票移动到函数中;您可以在子shell中显式运行循环(通过
(…)
),只需调用
exit
。我更改了代码,为找到的说话人创建并删除了一个虚拟文件。我猜另一个可行,因为它在一个
循环中,而
循环查看grep输出。非常感谢。
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