Regex LinuxBash:grep带有正则表达式错误

Regex LinuxBash:grep带有正则表达式错误,regex,linux,bash,grep,Regex,Linux,Bash,Grep,我正在尝试检测NIC是否已配置。(在Ubuntu1604上,因此主配置文件将是/etc/network/interfaces) 我准备了一个正则表达式来从接口文件中搜索配置,如下所示: ^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+eth0 当我直接将这个正则表达式放入grep命令时,它就工作了;但如果我将这个正则表达式放入一个变量中,然后在grep中使用它,那么grep将抛出错误: grep: Invalid regular expression 你能

我正在尝试检测NIC是否已配置。(在
Ubuntu
1604上,因此主配置文件将是
/etc/network/interfaces

我准备了一个正则表达式来从接口文件中搜索配置,如下所示:

^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+eth0
当我直接将这个正则表达式放入grep命令时,它就工作了;但如果我将这个正则表达式放入一个变量中,然后在grep中使用它,那么grep将抛出错误:

grep: Invalid regular expression
你能帮我弄清楚为什么把regex放进变量里是行不通的吗

谢谢

root@ci-1-0:/home/lisa# mainfn=/etc/network/interfaces
root@ci-1-0:/home/lisa# nic_name=eth0
root@ci-1-0:/home/lisa# pattern="^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+$nic_name"
root@ci-1-0:/home/lisa# echo $pattern
^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+eth0


root@ci-1-0:/home/lisa# grep -E "^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+eth0" $mainfn
auto eth0
iface eth0 inet dhcp

root@ci-1-0:/home/lisa# grep -E $pattern $mainfn
grep: Invalid regular expression

在my
OS Sierra
终端上,您的示例给出了稍微不同的错误消息:

> grep -E $pattern filename
grep: brackets ([ ]) not balanced
但如果我用引号将模式括起来,效果很好:

> grep -E "$pattern" filename
auto eth0
iface eth0 inet dhcp
问题是,如果没有引号,模式中的空格将被解释为参数之间的分隔符:

grep -E ^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+eth0 filename
          ^ HERE                             ^ (and also here)
换句话说,它试图在三个文件中搜索一个无效的正则表达式:
“\t]*(auto | iface | mapping | allow-.*)[”
“\t]+eth0”
(显然不存在)和
“filename”



作为
bash
中的一般规则,最好将变量的任何用法都用引号括起来,以避免此类空白问题。

为什么在第二个版本中删除引号?我不确定这是否是原因,但当您直接将其放入
grep-E
中时,您的模式被引号包围,然而,当使用
$pattern
时,它没有引号。编辑:我只是尝试了一下,但没有任何语法错误,但是尝试
grep-E“$pattern”$mainfn
当引号丢失时,您正在名为
\t]*…
的文件中查找(无效)regex
^[
。保留引号。bash中的默认规则。。。直到您更好地了解,在所有变量周围使用双引号