2013-01-14 49 views
1

我知道這必須是簡單的,但我只是沒有看到它。我們有一個文件SpeakerList.txt,它包含我們數據庫中的一系列揚聲器。 new.trs包含數據庫的空格分隔版本。我需要驗證是否在數據庫中找到了揚聲器,因此我爲以發言人名稱開頭的行運行grep。以下代碼總是在每個揚聲器的結尾觸發時產生if語句。我有一個類似的代碼檢查文件的存在,它工作得很好。我錯過了什麼?我知道我的grep循環正在運行 - 我用調試echo行嘗試過。我也嘗試打印$speakerFound字段,並且在最後確認它確實是空白的,即使我有一個聲明表明它早些時候標記爲「找到」。Bash - 國旗是不是設置爲找到文件的證據

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 

回答

3

您正在設置您的speakerFound變量在一個子殼中。閱讀this link瞭解更多詳情,但一般:

  • 當您重定向在bash循環的stdin,循環將在一個子shell執行。
  • 因爲循環是一個子shell,循環內部的變量賦值在循環外面將不可見。

一種解決方案是使用磁盤上的文件來包含結果(將其寫入內部循環,並在需要結果時將其讀回)。

+0

或者將支票移入函數並使用'return'來設置退出代碼,然後您可以檢查。 –

+0

我假設OP需要的不僅僅是一個結果代碼......但是如果是這樣的話,你不需要將支票移動到一個函數中;你可以顯式地在子shell中運行循環(通過'(...)'),並且只需調用'exit '。 – larsks

+0

這確實做到了。我更改了代碼以創建並刪除發現揚聲器的虛擬文件。我猜另一個人工作,因爲它是在一個'while'循環內查看grep輸出。謝謝。 –