如何将带空格的不带引号的字符串作为带引号的参数传递?

时间:2015-11-18 20:17:23

标签: bash quoting

更好地解释一个例子。我正在围绕mail命令编写一个简单的包装器(我的.bashrc中的一个函数)。

这是我当前无法正常工作的功能:

function email_me() { echo "$@" | mail -s "\"$@\"" myaddress@email.com; }

这是我想要的用法 - 这会发送主题和正文设置为testing 1 2 3的电子邮件。注意我特别不想手动输入引号。

~$ email_me testing 1 2 3

因此我希望字符串替换发生如下:

echo "testing 1 2 3" | mail -s "testing 1 2 3" myaddress@email.com

然而,无论我尝试什么,就好像-s参数没有引号一样,并且通过电子邮件将主题为"testing的电子邮件发送给以下收件人:1,2,3,和myaddress@email.com

如何让-s参数将“测试1 2 3”视为单个字符串?

1 个答案:

答案 0 :(得分:3)

我建议使用

function email_me() { printf %s\\n "$*" | mail -s "$*" myaddress@email.com; }
  • "$*"确实是一个包含所有参数的特殊变量,在一个字符串中
  • 使用printf代替echo可以帮助您避免使用-n -e以及echo支持的任何其他内容。

但是,在某些情况下,您必须引用email_me的参数以避免通配并保留空格:

email_me 2 * 2 = 4
[sends you all file names in current directory]
email_me a   b
[sends "a b" with only one space]