我需要在给定的输入字符串中找到一些特殊字符。 如果字符串包含以下特殊字符,则应该找出。 我正在做egrep寻找角色。 我的代码适用于每个字符,但不适用于单引号。 请找到我的代码段。
splCharCheck='egrep "&|\"|:|\'" | wc -l'
count=`echo "$Name" | eval $splCharCheck`
任何人都可以帮我解决单引号的问题吗?
答案 0 :(得分:0)
不要“逃避”单引号。检查以下内容:
# cat test
'name with quotes'
no quotes
# cat test | egrep "'"
'name with quotes'
# cat test | egrep "\'"
'name with quotes'
no quotes
答案 1 :(得分:0)
你想要达到什么目的?这有点像XY问题。
在bash中,您可以使用
轻松转义文本printf "%q\n" "$Name"
E.g:
$ Name="Some 'intricate' value"
$ printf "%q\n" "$Name"
Some\ \'intricate\'\ value
答案 2 :(得分:0)
您正试图在双引号字符串中嵌入单引号,该字符串位于单引号字符串中。问题是在单引号字符串中,双引号不被视为任何特殊的引号,因此中间的单引号被视为单引号字符串的结尾而不是它的一部分。为此,您需要结束单引号字符串('egrep "&|\"|:|'
),以其他方式转义单引号(\'
或"'"
),然后启动新的单引号字符串,包含您想要的其余内容('" | wc -l'
)。最终结果:
splCharCheck='egrep "&|\"|:|'\''" | wc -l'
但是,我必须同意@sehe,看起来你正试图解决错误的问题。为什么要将此命令放在变量中而不是直接执行?这是generally a bad idea(和eval
只会增加更多机会让事情变得奇怪)。而且,进一步备份,你真正想做什么?
P.S。如果你必须使用eval
,至少要双重引用你正在评估的字符串。如果不这样做可能会导致一些严重难以理解的错误。最后,我建议使用$( )
而不是反引号,因为它解析奇怪的次数较少:
count=$(echo "$Name" | eval "$splCharCheck")