2014-06-20 28 views
1

我有打算處理一個服務器的一些基本的grep的檢查〜/ .m2目錄/ settings.xml中設定一個shell腳本如下功能:用grep來檢查文件內容中隱藏的目錄

SETTINGS_FILE="~/.m2/settings.xml" 
SETTINGS_SERVER_ID="<id>ossrh</id>" 
check_settings() { 
    echo grep "$1" "$SETTINGS_FILE" 
    if grep -q "$1" "$SETTINGS_FILE"; then 
     echo "Server is set up...\n"; else 
     echo "DEPLOY FAILED:\n\t$1 not found in ${SETTINGS_FILE}! 
     fail "Fail :("; 
    fi 
    return 0 
} 
check_settings $SETTINGS_SERVER_ID 

不幸,這將導致以下消息:

grep <id>ossrh</id> ~/.m2/settings.xml 
grep: ~/.m2/settings.xml: No such file or directory 
DEPLOY FAILED: 
    <id>ossrh</id> not found in ~/.m2/settings.xml! 
Fail :(

同時,只使用grep "<id>ossrh</id>" ~/.m2/settings.xml在Bash返回<id>ossrh</id>,預計。

我想知道這是否是一個可見性問題 - grep是否可以在隱藏目錄中看到事物(不太可能,考慮this question)或者它是否與我傳遞grep的參數有關(可能,考慮新的我要shell腳本)

回答

4

當變量值在引號中時,~/前綴不會展開到您的主目錄。改變第一行:

SETTINGS_FILE=~/.m2/settings.xml 

的線索,這是該錯誤消息包括~前綴。如果前綴已擴展,則錯誤消息將包含目錄的絕對路徑名。

4

Barmar's答案是正確的,但你也可以寫這樣的:

SETTINGS_FILE=~/'.m2/settings.xml' 

這種方式可以包含特殊字符和其他的東西,應該被引用。如果您需要使用變量,請隨意將單引號更改爲雙引號。 (我總是喜歡單引號的時候裏面有沒有變量)

但是,因爲您也可以使用$HOME代替~,我會寫這樣的:

SETTINGS_FILE="$HOME/.m2/settings.xml" 
+0

這將更加清晰,如果第一個' /'在引號內。 – BroSlow

+1

@BroSlow但它不會這樣工作。嘗試一下。 –

+3

有趣的是,不知道只有在用'/'連接或用空白包圍時擴展了代字號。學到了新東西,謝謝/ + 1 – BroSlow