2015-04-21 22 views
0

我試圖在查詢日誌文件的bash腳本中創建一個函數。在查詢功能,我有一些類似於如下:Bash:在引用的表達式中使用grep引用的變量

if [ -n "$(cat some-log-file.log | grep \"$1\")" ]; then 
    echo "There is a match." 
else 
    echo "No lines matched the search term." 
fi 

如果我送東西,我知道會在日誌文件爲$ 1,像「我不要」,我得到的輸出:

$ ./y.sh查詢「我不知道」
的grep:不要「:沒有這樣的文件或目錄
號線相匹配的搜索項

如果我嘗試單引號$。 ()表達式,它發送文字字符串,並始終評估爲true。我猜它與grep inte的方式有關打破反斜槓,但我無法弄清楚。也許我正在監督一些簡單的事情,但我一直在這裏呆了幾個小時,在論壇上尋找,並插入各種奇怪的引號和轉義字符組合。任何幫助或建議表示讚賞。

回答

3

它其實真的很簡單,如果你意識到$()允許有轉義引號

if [ -n "$(cat some-log-file.log | grep "$1")" ]; then 
    echo "There is a match." 
else 
    echo "No lines matched the search term." 
fi 

實際上,你甚至可以跳過這一步,不過,因爲grep給出了相應的退出碼:

if grep -q "$1" some-log-file.log; then 
    echo "There is a match." 
else 
    echo "No lines matched the search term." 
fi 

總之,這與"$1"的工作原理相同:Shell參數擴展和命令替換髮生be前分詞和報價刪除。查看更多關於bash如何解析Shell Expansions section of the bash manual中的命令的信息。

+0

謝謝了。兩種解決方案都很好,但我贊成第二種解決方案。 – shloosh

相關問題