【问题标题】:Setting a Variable = to a string in a text file将变量 = 设置为文本文件中的字符串
【发布时间】:2014-04-17 17:21:17
【问题描述】:

我正在尝试将一行文本文件直接放在邮件函数中。该字符串在文本文件中带有“”。

mailx -s "New Member" "cat ../address" 

../address 中的一行是 'my-email@gmail.com',包括 ' ' 引号。

cat ../address 不是最好的方法,但我不知道有什么其他方法可以尝试。

要求的结果应该是:

mailx -s "New Member" 'my-email@gmail.com'

【问题讨论】:

  • 你可以这样做:mailx -s "New Member" $(</path/to/address)
  • 请注意,文件包含单引号,在mailx可以将其用作有效地址之前需要将其去掉。
  • 感谢您的回答。我正在尝试。

标签: string bash substitution cat


【解决方案1】:

您需要删除文字 ' 字符。从该行开始,以便将地址正确传递给mailx

有不止一种方法可以做到这一点:

mailx -s "New Member" "$(tr -d "'" < ../address)"

mailx -s "New Member" "$(xargs < ../address)"

注意:以上假设 ../address 仅包含 1 行。

@chepner 提出了一个重要的观点:

将引号存储在文件中,然后将它们读入[并使用未引用的结果]与引用命令替换相同。

进一步详细说明:

  • OP 将'my-email@gmail.com' 显示为传递给mailx 的所需参数。在这种 直接 形式的单引号中,bash 将在处理 - unexpanded - 字符串 内容之前删除引号(参见 man bash 中的 Quote Removal 部分) ,不带引号,mailx

  • 间接引用不起作用:读入恰好包含文字引号字符的字符串不会被 bash 删除引号,因此括起来的引号作为字符串的一部分传递 - mailx 会看到一个以' 开头(和结尾)的无效电子邮件地址。

  • 因此,解决方法是:

    • 首先从输入字符串中删除引号
    • 然后使用直接引用来保护结果免受(进一步)shell扩展;请注意,-引号是必需的,以确保对命令替换 (($...)) 进行评估。

【讨论】:

  • 删除我的答案是多余的,但要强调 OP 将引号存储在文件中然后读取它们与引用命令替换不同。
  • @chepner:我正要对你的观点投赞成票 :) 我会将其纳入答案中。
【解决方案2】:

使用反引号进行命令替换。我假设文件中只有一行。

mailx -s "New Member" `cat ../address`

反引号的另一种/更好的形式是$()

mailx -s "New Member" $(cat ../address)

【讨论】:

  • 不要使用反引号:使用$(...),这样更具可读性和可嵌套性。
  • @chepner,$() 是否与 Bourne shell 兼容,还是一种 bashism?
  • @SzG:它是 POSIX 标准的一部分 - 请参阅 pubs.opengroup.org/onlinepubs/9699919799/utilities/…
  • 另外,请注意 POSIX != Bourne shell。与标准相比,实际的 Bourne shell 相对有限,但两者经常混淆,因为标准指定 shell 为 /bin/sh,这是 Bourne shell 的传统名称。
  • @chepner:很好,感谢您说清楚。 @SzG:请注意,输入文件包含文字 ' 字符,必须先将其剥离 - 请参阅 @chepner 的 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 2016-07-18
  • 2011-10-11
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多