2010-03-19 65 views
103

當我們的服務器啓動時,我們需要檢查一個文件來查看服務器是如何配置的。如何在bash if/else語句中使用grep比較文件?

我們要尋找我們的/etc/aws/hosts.conf文件中的以下字符串:

MYSQL_ROLE=master 

然後,我們要測試該字符串是否存在和使用if/else語句運行取決於字符串是否存在的兩個選項之一。

if語句的BASH語法是什麼?

if [ ????? ]; then 
    #do one thing 
else 
    #do another thing 
fi 

回答

148

grep --help,還能看到man grep

退出狀態爲0,如果被選擇的線,否則爲1; 如果發生任何錯誤,並沒有給出-q,退出狀態爲2

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then 
    echo exists 
else 
    echo not found 
fi 

您可能需要使用更具體的正則表達式,如^MYSQL_ROLE=master$,以避免在評論該字符串,名稱是僅僅從「主」開始等

這是可行的,因爲如果接受命令並運行它,並使用該命令的返回值來決定如何繼續,零意味着真和非零含義假如—與shell解釋其他返回碼的方式相同,相反像C.

一種語言的
+0

謝謝!奇蹟般有效。 – user77413 2010-03-19 21:31:01

27

if接收命令並檢查其返回值。 [只是一個命令。

if grep -q ... 
then 
    .... 
else 
    .... 
fi 
3

嘗試:

if [ -n "`grep \"MYSQL_ROLE=master\" /etc/aws/hosts.conf`" ]; then 
+0

這是一個有點...過度。 – 2017-11-01 14:55:02

2

只是使用bash

while read -r line 
do 
    case "$line" in 
    *MYSQL_ROLE=master*) 
     echo "do your stuff";; 
    *) echo "doesn't exist";;  
    esac 
done <"/etc/aws/hosts.conf" 
+0

更好的方法來做到這一點! – nevelis 2012-10-31 21:13:31

18

注意,爲PIPE是任何命令或命令序列,則:

if PIPE ; then 
    # do one thing if PIPE returned with zero status ($?=0) 
else 
    # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error 
fi 

對於記錄,[ expr ]是殼內建test expr的簡寫。

由於在匹配的情況下grep返回狀態爲0,並在沒有比賽的情況下,非零的狀態,你可以使用:

if grep -lq '^MYSQL_ROLE=master' ; then 
    # do one thing 
else 
    # do another thing 
fi 

注意使用-l只在乎具有文件至少有一次匹配(以便grep一找到一個匹配就返回,而不會不必要地繼續解析輸入文件。在一些平臺上[ expr ]

不是內置,而是一種實際的可執行/bin/[(其最後一個參數會]),這就是爲什麼[ expr ]應該包含空格前後的方括號,以及爲什麼它必須遵循通過one of the command list separators;&&|||&,換行)

+3

'-l'是多餘的,'grep'在找到與'-q'的任何匹配後立即返回 – BroSlow 2014-10-23 22:58:55