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

时间:2019-04-03 19:53:19

标签: shell ksh command-substitution

我正在尝试查找与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

1 个答案:

答案 0 :(得分:1)

NB2=$(grep -v -c -E -e '^\".*\"$' abc.txt)

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

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

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

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