在shell脚本中使用eGrep时,请引用单个引号



我需要在给定的输入字符串中找到一些特殊字符。如果字符串包含以下特殊字符,则应发现。我正在做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 "%qn" "$Name"

例如:

$ Name="Some 'intricate' value"
$ printf "%qn" "$Name"
Some 'intricate' value

您正在尝试将单引号嵌入到单引号字符串中的双引号字符串中。问题在于,在单引号的字符串中,双引号没有将其视为任何特殊的东西,因此中间的单引号被视为单引号字符串的末端,而不是其中的一部分。为了做到这一点,您需要结束单引号('egrep "&|"|:|'),逃脱孤独的单语言('"'"),然后在其余部分中启动一个新的单引号的字符串('" | wc -l')。最终结果:

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

但是,我必须同意@sehe的观点,似乎您正在尝试解决错误的问题。您为什么将此命令放在变量中而不是直接执行?这通常是一个坏主意(而且eval只是为事情变得更奇怪而增加了更多的机会)。而且,进一步备份,您真正想做什么?

P.S。如果您必须使用 eval,则至少要双引号评估。不这样做可能会导致一些严重的错误。最后,我建议使用$( )代替回音,因为它的解析较少:

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

最新更新