2009-10-02 119 views
0

我是新手bash腳本(和* nix shell完全),但我正在嘗試編寫此腳本以使代碼庫變得更簡單。從bash腳本調用grep

我寫了這個

#!/bin/bash 
args=("[email protected]"); 
for arg in args 
grep arg * */* */*/* */*/*/* */*/*/*/*; 
done 

,當我嘗試運行它,這是發生了什麼:

~/Work/richmond $ ./f.sh "\$_REQUEST\['a'\]" 
./f.sh: line 4: syntax error near unexpected token `grep' 
./f.sh: line 4: `  grep arg * */* */*/* */*/*/* */*/*/*/*;' 
~/Work/richmond $

我該怎麼做這個正常嗎?

而且,我認爲一個更重要的問題是,我怎樣才能讓grep像這樣通過子目錄正確遞歸?

任何其他的提示和/或與shell腳本和一般使用bash的陷阱也將不勝感激。

+0

PS:你可以使用'for arg'來刪除一行:這是'$ @'''中arg的快捷方式。 – l0b0 2011-09-19 12:59:41

回答

9

語法錯誤是因爲您錯過了do。至於遞歸搜索,如果你的grep-R選項,你會怎麼做:

#!/bin/bash 
for arg in "[email protected]"; do 
    grep -R "$arg" * 
done 

否則,你可以使用find

#!/bin/bash 
for arg in "[email protected]"; do 
    find . -exec grep "$arg" {} + 
done 

在後一個例子,find將執行grep和更換{}大括號從當前目錄.開始查找它找到的文件名。

(請注意,我也改變arg"$arg"。你需要的美元符號來獲取變量的值,並引號告訴shell將它的值作爲一個大的字,哪怕$arg包含空格或換行符。)

+0

這是完美的,謝謝 – 2009-10-02 21:07:22

+0

在迭代命令行參數時,您也可以省略「$ @」並將它寫爲「for arg; do ...」 – Idelic 2009-10-03 05:10:52

3

在recusive grepping:

根據您的grep版本,你可以通過-R您grep命令,才能在搜尋遞歸(子目錄中)。

1

最好的解決辦法是如上所述,但是儘量把你的陳述在反勾:

`grep ...` 
+1

沒有理由使用反引號(或首選'$()')在OP的腳本中或任何發佈到目前爲止的答案中。如果他將結果分配給一個變量或將其作爲參數用於另一個命令,則情況會有所不同。 – 2009-10-02 21:48:23

1

你應該用「發現」加「xargs的」做文件搜索。

for arg in "[email protected]" 
do 
    find . -type f -print0 | xargs -0 grep "$arg" /dev/null 
done 

的「-print0」和「-0」選項假設你使用GNU grep,並確保該腳本工作,即使有空格或其他意外的字符在你的路徑名。像這樣使用xargs比使用find爲每個文件執行它更有效率; /dev/null出現在參數列表中,因此grep總是報告包含匹配的文件的名稱。

您可能會決定簡化生活 - 也許 - 通過將所有搜索合併到一個使用egrepgrep -E。一次優化將捕獲來自find的輸出一次,然後在每次迭代中將其輸出到xargs

0