【问题标题】:Bash variable expansion [duplicate]Bash变量扩展[重复]
【发布时间】:2016-02-02 18:52:16
【问题描述】:

我遇到了一些肯定有简单解决方案的东西。我正在使用来自 GNU mailutils 的邮件定期向相关人员发送日志文件。

mail -s "The Subject" someone@example.com <<< "Message body"

现在我想将它合并到执行一堆任务的脚本中,但我被扩展和引号卡住了。

这就是我正在尝试的:

subject="The Subject"
sender=From:Sender\<someone@example.com\>
recipient_list=me@example.com,another@example.com,yetanother@example.com

report="mail -s "$subject" -a $sender $recipient_list"

...
$report <<< "A log message from a section of script"
...
$report <<< "A different log message"

问题在于 $subject。
调用mail -s "$subject" -a $sender $recipient_list &lt;&lt;&lt; "My Message" 效果很好,但是像我上面所做的那样将它包装到一个变量中最终会发送电子邮件,其中只发送“主题”的第一个单词,而不是整个字符串。

我要去proper function route,但现在我很好奇。 我确信一些转义/扩展技巧会做到这一点,但我无法找到正确的(或推理出来)。

谢谢!

【问题讨论】:

  • @chepner 谢谢,但已经在我最初的问题中了
  • 你读过这个页面吗?它解释了为什么您尝试在变量值中嵌入引号失败。
  • 无论你如何转义字符,都没有简单字符串的解决方案,因为 shell 字符串只是字符串。字符串的一部分在创建字符串时被转义的事实并未存储在字符串的任何位置。你可以使用eval,但这很难看。您可以使用数组(这很容易)。或者你可以使用一个函数(它是可移植的)。
  • @chepner 我确实阅读了该页面,但不要认为我完全掌握了它。将尝试更深入地挖掘。干杯!

标签: bash


【解决方案1】:

答案当然是use an array

report=(mail -s "$subject" -a "$sender" "$recipient_list")

 ...

"${report[@]}" <<< "A log message from a section of script"

【讨论】:

  • 使用数组……或者使用函数……
  • 如果您可以按照此处的建议编辑以在 ${report[@]} 周围放置双引号,则将标记为答案stackoverflow.com/questions/13365553/… 如果没有双引号,它将无法正确执行。
  • @dabell: facepalm 哎呀。固定。
猜你喜欢
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
相关资源
最近更新 更多