如何在ksh命令替换中包含变量?

问题描述 投票:1回答:1

我试图找到一些与grep中的正则表达式匹配的行作为变量接收。当我在命令替换中直接使用模式执行grep时,它可以工作。当我为模式使用变量时,它不会。

#!/bin/bash

pattern="'^\\\".*\\\"$'"
echo "pattern : $(echo $pattern)"
NB=$(grep -c -E -v -e ${pattern} abc.txt)
NB2=$(grep -v -c -E -e '^\".*\"$' abc.txt)
echo " -> $NB , $NB2"

除了代码中的内容,我尝试过:

NB=$(grep -c -E -v -e $(echo $pattern) abc.txt)

没有成功。

cmd="grep -c -E -v -e ${pattern} abc.txt"
NB="$($cmd)"

没有成功。

在示例中,abc.txt文件包含3行:

"abc"
"abc
abc"

变量中的模式似乎没问题:

pattern : '^\".*\"$'

我期待NB和NB2中的2个数字是相同的。如果您查看代码,实际结果是:

pattern : '^\".*\"$'
 -> 3 , 2

我预计:

pattern : '^\".*\"$'
 -> 2 , 2
shell ksh command-substitution
1个回答
1
投票
NB2=$(grep -v -c -E -e '^\".*\"$' abc.txt)

如果可行,则将该精确正则表达式分配给$pattern。不要添加更多反斜杠和引号。

pattern='^\".*\"$'

引用变量扩展以防止不必要的通配符扩展和单词拆分始终是个好主意。

NB=$(grep -c -E -v -e "${pattern}" abc.txt)
#                     ^          ^
© www.soinside.com 2019 - 2024. All rights reserved.