2014-02-23 124 views
0

如果我在文件中找到一個值,我需要返回true或false。我解析文件,如果這個值是一次就足夠了,我想打破並返回一個真正的else返回false。最重要的是我需要將文件傳遞到這個檢查函數。我試圖只使用bash。Bash循環控制while if else else return

is_file_contains_VAR(){ 
    VARFILENAME=$1 

    while read LINE 
    do 
     if echo "$LINE" | grep -q "$VAR"; then 
      break 
      return 0 
     else 
      return 1 
     fi 
    done < $VARFILENAME 
} 
+1

第一件事,你可能想在這裏做的:寫這是一個循環,你會希望儘快有一個匹配,只有在最後return 1,如果你從來沒有找到匹配的是return 0是問自己什麼樣的聲明_immediately after_「break」可能會... –

+0

休息應該讓我擺脫,至少我希望。我不希望它繼續貫穿整個文件。 – MAXGEN

+0

這樣就不會執行'return 0'。 –

回答

3

grep -q已經你想要做什麼:它會盡快找到有問題的字符串中止。所以,你可以只寫:

function is_file_contains_VAR() { 
    grep -q -e "$VAR" "$1" 
} 

(注:-e是萬一"$VAR"開始用連字符。)

但對教育目的。 。 。

function is_file_contains_VAR() { 
    local VARFILENAME="$1" 
    local LINE 
    while IFS= read -r LINE ; do 
     if grep -q -e "$VAR" <<< "$LINE" ; then 
      return 0 
     fi 
    done < "$VARFILENAME" 
    return 1 
} 
+0

此外,如果使用顯示的'bash'循環,則使用'bash'內置的正則表達式支持,而不是分支' grep'進程:'if [[「$ LINE」=〜$ VAR]]; then'。你需要確保'VAR'符合'bash'理解的正則表達式。 – chepner

+0

你是什麼意思的「分叉」一個grep?這是否打開一個新的線程是你的意思? bash中是否支持grep本身,這意味着我可以在任何帶有bash的機器上使用它? – MAXGEN

+0

@MAXGEN:不是「分支'grep'」,而是「分支'grep' **進程**」;也就是說,使用'fork()'創建一個新的進程,然後用它來運行'grep'。 (如果你不熟悉分叉和流程,那麼請將它們Google給他們;我不能/不會在簡短的評論中解釋它們。)Re:「grep本身在bash中支持,這意味着我可以在任何情況下使用它機器與bash?「:否。他們是單獨的程序。如果你有bash,你通常會*擁有grep,但是有很多例外。 – ruakh