2012-10-04 45 views
1

我正在嘗試編寫一個bash shell腳本(這是我沒有太多經驗的東西)在我正在運行的Unix機器上搜索C代碼通過ssh。「調試」bash shell腳本:轉義字符,傳遞參數

這是我的腳本代碼:

#! /bin/bash 

find . \(-name '*.c' -o -name '*.h' \) -exec grep -n '<SEARCH_STRING>' {} + | sed -e "s/^\(\..*\.c\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" | sed -e "s/^\(\..*\.h\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" | sed ''/<SEARCH_STRING>/s//`printf "\033[31m<SEARCH_STRING>\033[0m"`/'' | less -R 

注意,僅僅是我用什麼來代表我的搜索字符串,當然,我沒有真正尋找這個從字面上。

我意識到這有幾件事是錯誤的。首先,當我在命令行輸入最後一行(沒有它的#!/ bin/bash頭文件的「腳本」)時,它實際上工作得很好,給了我想要的結果。我知道,使它成爲一個bash腳本時,我應該逃避某些字符,但我試過幾個逃逸(組合)字符,它總是給我同樣的錯誤:

find: missing argument to `-exec' 
./code_search.sh: line 4: <SEARCH_STRING>: command not found 
sed: -e expression #1, char 43: unterminated `s' command 
printf: usage: printf [-v var] format [arguments] 
./code_search.sh: line 8: \033[31m<SEARCH_STRING>\033[0m: command not found 
sed: -e expression #1, char 46: unterminated `s' command 

而且,我知道我不該不會將搜索字符串硬編碼到我的腳本中,因爲將搜索字符串作爲參數提供給腳本會更加方便,但我真的無法弄清楚如何執行此操作。

正如我所說,我沒有很多寫bash腳本的經驗,並且我嘗試寫這個腳本來幫助我完成我的編碼工作。然而,我不能再花時間去調試這個看法,因爲這不是我的老闆支付我做的事情。我問過我的同事們,但他們都不能幫助我。

我知道這是一個有點廉價,不要付出很多努力去了解更多關於bash shell腳本編寫的內容,但就像我說的我真的無法節省時間。任何人都可以請幫我完成這個腳本?

非常感謝!

回答

0

以這種方式,它不會給出任何錯誤。

#! /bin/bash 

searchstring=$1 

find . \(-name '*.c' -o -name '*.h' \) -exec grep -n "$searchstring" {} + \ 
     | sed -e "s/^\(\..*\.c\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" \ 
     | sed -e "s/^\(\..*\.h\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" \ 
     | sed ''/"$searchstring"/s//`printf "\033[31m""$searchstring""\033[0m"`/'' \ 
     | less -R 

但是,這並不意味着它的作品。沒有一些樣本輸入和期望的輸出,就不可能進一步提供幫助。例如,第三個sed對我來說似乎是錯誤的。

+0

感謝您的幫助! 樣本輸入類似'./code_search.sh isValid',樣本輸出類似 '/users/user/code/codefile1.c :: 15 boolean isValid,activatesCheck; /users/user/code/codefile1.c :: 321 if(!isValid){' 儘管我仍然運行它,但仍然出現錯誤;顯示有問題發現: 查找:路徑必須在表達式 之前用法:find [-H] [-L] [-P] [path ...] [expression]' – user1719396

0

這是因爲,在最後的sed命令中,字符<未被轉義:雙引號只表示空字符串'';並且<被解釋爲文件重定向,shell嘗試從文件「SEARCH_STRING」中讀取。

sed ''/<SEARCH_STRING>/s//`printf "\033[31m<SEARCH_STRING>\033[0m"`/'' 

應改爲

sed '/<SEARCH_STRING>/s//'`printf "\033[31m<SEARCH_STRING>\033[0m"`'/' 

此外,以下錯誤,查找版本可能不支持+ at命令的外觀在man find末,在這種情況下+ functionnality可以這樣做xargs(但是如果文件名可以包含空格,這可能會失敗)

find . \(... \) | xargs grep -n '<SEARCH_STRING>' 
+0

感謝您的幫助! 我試着改變你的建議(包括合併和分開),但我仍然無法讓腳本工作。 每當我改變某些東西時,我仍然遇到錯誤;顯然有一個問題發現: 查找:路徑必須在表達式 之前用法:find [-H] [-L] [-P] [path ...] [expression]' – user1719396