【问题标题】:How do I include a variable in a ksh command subtitution?如何在 ksh 命令替代中包含变量?
【发布时间】:2019-04-04 03:59:57
【问题描述】:

我正在尝试在作为变量接收的 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

【问题讨论】:

  • 是 ksh 还是 bash?你的文章说 ksh,你的 shebang 行说#!/bin/bash

标签: shell ksh command-substitution


【解决方案1】:
NB2=$(grep -v -c -E -e '^\".*\"$' abc.txt)

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多