小编Cri*_*gie的帖子

Bash 将变量内的引号读取为文本,而不是引号?Bash 中有“隐式引用”吗?

我有一个 bash 脚本可以定期清理邮件队列。出于某些原因,我们选择删除发送至 @mms.att.net 和其他 email2SMS 网关的所有在队列中超过 9 小时但仍未送达的电子邮件。

简单来说,该脚本执行以下操作:

domains=`cat /etc/mail/email2textdomains.txt`
egrep $domains /var/log/maillog | .... other tasks
Run Code Online (Sandbox Code Playgroud)

的内容/etc/mail/email2textdomains.txt正是

"mms.att.net|vtxt.com|vtext.com|vzwpix.com"
Run Code Online (Sandbox Code Playgroud)

因此,egrep 行应该是这样的,这正是我在命令行中输入的内容。

egrep "mms.att.net|vtxt.com|vtext.com|vzwpix.com" file | ...
Run Code Online (Sandbox Code Playgroud)

如果我像这样运行它,那么它是一个 5 个以上阶段的命令管道,每个命令从前一个标准输出读取标准输入。这显然不是我想做的搜索。

egrep  mms.att.net|vtxt.com|vtext.com|vzwpix.com  file | ...
Run Code Online (Sandbox Code Playgroud)

然而,在运行时,两个双引号的处理方式不同 - 它们成为字符串的一部分,所以我们本质上是在搜索

  • “mms.att.net
  • vtxt.com
  • vtext.com
  • vzwpix.com”

显然,我误解了引用的工作原理 - 解决方案是更改包含的行以删除双引号,导致一行不应该工作,但可以。

我尝试通过管道进行测试,od -a不显示任何非打印字符。

为什么它有效,使得内容/etc/mail/email2textdomains.txt正是

mms.att.net|vtxt.com|vtext.com|vzwpix.com
Run Code Online (Sandbox Code Playgroud)

什么时候应该像所写的那样是一个很长的失败管道?

bash shell-script quoting

5
推荐指数
1
解决办法
597
查看次数

标签 统计

bash ×1

quoting ×1

shell-script ×1