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サブシェルで変数を設定しています。詳細については、このリンクを参照してください。ただし、一般的には次のとおりです。

  • stdinbash でループのをリダイレクトすると、ループはサブシェルで実行されます。
  • ループはサブシェルであるため、ループ内の変数の割り当てはループの外では見えません。

解決策の 1 つは、ディスク上のファイルを使用して結果を格納することです (内側のループに書き込み、結果が必要なときに読み戻します)。

于 2013-01-14T14:36:00.303 に答える