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

How do I include a variable in a ksh command subtitution?

我试图在作为变量接收的 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
NB2=$(grep -v -c -E -e '^\".*\"$' abc.txt)

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

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

引用变量扩展总是一个好主意,以防止不需要的通配符扩展和单词拆分。

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