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

Bash 如何将带空格的无引号字符串作为带引号的参数传递?,bash,quoting,Bash,Quoting,最好用一个例子来解释。我正在围绕mail命令编写一个简单的包装器(my.bashrc中的一个函数) 以下是我当前无法正常工作的函数: function email_me() { echo "$@" | mail -s "\"$@\"" myaddress@email.com; } 这是我想要的用法-这将发送一封主题和正文都设置为testing 1 2 3的电子邮件。注:我特别不想手动输入引号 ~$ email_me testing 1 2 3 因此,我希望字符串替换如下所示: echo "t

最好用一个例子来解释。我正在围绕mail命令编写一个简单的包装器(my.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和3myaddress@email.com

如何使-S参数考虑“测试1 2 3”为一个字符串?

< P>我建议使用

function email_me() { printf %s\\n "$*" | mail -s "$*" myaddress@email.com; }
  • “$*”
    确实是一个特殊变量,它将所有参数都包含在一个字符串中
  • 使用
    printf
    而不是
    echo
    可以避免您对
    -n
    -e
    以及您的
    echo
    实现所支持的任何其他功能感到惊讶
不过,在某些情况下,您必须引用
email\u 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]

关于你的
“\“$@”
方法不起作用的原因:
$@
在双引号中,扩展到
“$1”“$2”
…使用拆分的单词,
\“
是一个文字引号,因此你最终得到的是
“$1”
作为第一个单词,
“$2”
作为第二个单词,
“$N”
作为最后一句话。阅读有关扩展的详细信息。是的,只是想让从命令行给自己发送一封单行电子邮件变得非常简单。谢谢你的建议;那太好了!将
$@
替换为
$*
,您的函数应按预期工作。无需为转义引号添加“”上面的注释是正确的(假设
IFS
的第一个字符是空格)。我暂时感到困惑。请尝试此
函数email\u me(){echo“$@”mail-s“$*”myaddress@email.com;}