我需要在給定的輸入字符串中找到一些特殊字符。 如果字符串包含以下特殊字符,它應該查明。 我正在做egrep查找字符。 我的代碼適用於每個字符,但不是單引號。 請找到我的代碼片段。在shell腳本中使用egrep時隱藏單引號
splCharCheck='egrep "&|\"|:|\'" | wc -l'
count=`echo "$Name" | eval $splCharCheck`
任何人都可以幫助我如何逃避單引號嗎?
我需要在給定的輸入字符串中找到一些特殊字符。 如果字符串包含以下特殊字符,它應該查明。 我正在做egrep查找字符。 我的代碼適用於每個字符,但不是單引號。 請找到我的代碼片段。在shell腳本中使用egrep時隱藏單引號
splCharCheck='egrep "&|\"|:|\'" | wc -l'
count=`echo "$Name" | eval $splCharCheck`
任何人都可以幫助我如何逃避單引號嗎?
不要「逃避」單引號。如下,請檢查:
# cat test
'name with quotes'
no quotes
# cat test | egrep "'"
'name with quotes'
# cat test | egrep "\'"
'name with quotes'
no quotes
你想達到什麼目的?這味道像一個XY問題。
在bash,你可以逃脫的文字,輕鬆使用
printf "%q\n" "$Name"
如:
$ Name="Some 'intricate' value"
$ printf "%q\n" "$Name"
Some\ \'intricate\'\ value
你試圖嵌入雙引號的字符串裏面單內單引號引用的字符串。問題是在單引號字符串中,雙引號不被視爲任何特殊字符,因此中間的單引號被視爲單引號字符串的結尾,而不是其中的一部分。爲了做到這一點,您需要結束單引號字符串('egrep "&|\"|:|'
),以其他方式(\'
或"'"
)跳過唯一的單引號,然後用剩下的所有內容開始一個新的單引號字符串('" | wc -l'
)。最終結果:
splCharCheck='egrep "&|\"|:|'\''" | wc -l'
但是,我必須同意@sehe,它看起來像你試圖解決錯誤的問題。你爲什麼把這個命令放在一個變量中,而不是直接執行它?這是generally a bad idea(和eval
只是增加了更多的機會讓事情變得怪異)。而且,進一步備份,你真的想做什麼?
p.s.如果您必須使用eval
,請至少對您的字符串進行雙重引號。不這樣做可能會導致一些嚴重不可思議的錯誤。最後,我建議使用$()
而不是反引號,因爲它具有較少的解析奇怪點:
count=$(echo "$Name" | eval "$splCharCheck")