2012-10-29 27 views
1

我需要在給定的輸入字符串中找到一些特殊字符。 如果字符串包含以下特殊字符,它應該查明。 我正在做egrep查找字符。 我的代碼適用於每個字符,但不是單引號。 請找到我的代碼片段。在shell腳本中使用egrep時隱藏單引號

splCharCheck='egrep "&|\"|:|\'" | wc -l' 

count=`echo "$Name" | eval $splCharCheck` 

任何人都可以幫助我如何逃避單引號嗎?

回答

0

不要「逃避」單引號。如下,請檢查:

# cat test 
'name with quotes' 
no quotes 

# cat test | egrep "'" 
'name with quotes' 

# cat test | egrep "\'" 
'name with quotes' 
no quotes 
0

你想達到什麼目的?這味道像一個XY問題。

在bash,你可以逃脫的文字,輕鬆使用

printf "%q\n" "$Name" 

如:

$ Name="Some 'intricate' value" 
$ printf "%q\n" "$Name" 
Some\ \'intricate\'\ value 
0

你試圖嵌入雙引號的字符串裏面單內單引號引用的字符串。問題是在單引號字符串中,雙引號不被視爲任何特殊字符,因此中間的單引號被視爲單引號字符串的結尾,而不是其中的一部分。爲了做到這一點,您需要結束單引號字符串('egrep "&|\"|:|'),以其他方式(\'"'")跳過唯一的單引號,然後用剩下的所有內容開始一個新的單引號字符串('" | wc -l')。最終結果:

splCharCheck='egrep "&|\"|:|'\''" | wc -l' 

但是,我必須同意@sehe,它看起來像你試圖解決錯誤的問題。你爲什麼把這個命令放在一個變量中,而不是直接執行它?這是generally a bad idea(和eval只是增加了更多的機會讓事情變得怪異)。而且,進一步備份,你真的想做什麼?

p.s.如果您必須使用eval,請至少對您的字符串進行雙重引號。不這樣做可能會導致一些嚴重不可思議的錯誤。最後,我建議使用$()而不是反引號,因爲它具有較少的解析奇怪點:

count=$(echo "$Name" | eval "$splCharCheck")