Bash 使用echo通过管道传输带有C样式注释的字符串

Bash 使用echo通过管道传输带有C样式注释的字符串,bash,echo,Bash,Echo,在我的bash脚本中,我使用echo将包含c样式注释的字符串通过管道传输到mail命令中,如下所示: echo-e$EMAIL_TXT|mail-s“$SUBJECT”$RECIPIENT其中$EMAIL_TXT包含 “/*一些文本*/”。在电子邮件中,我得到了根目录中所有目录的列表,因为它实际上将/*评估为根目录中的所有目录。如何让脚本将其作为字符串而不是实际命令进行计算?在$EMAIL\u TXT echo "$EMAIL_TXT" 关于-e的注释: -e使echo的参数中的转义序列(例如

在我的bash脚本中,我使用echo将包含c样式注释的字符串通过管道传输到mail命令中,如下所示:
echo-e$EMAIL_TXT|mail-s“$SUBJECT”$RECIPIENT
其中
$EMAIL_TXT
包含

“/*一些文本*/”
。在电子邮件中,我得到了根目录中所有目录的列表,因为它实际上将
/*
评估为根目录中的所有目录。如何让脚本将其作为字符串而不是实际命令进行计算?

$EMAIL\u TXT

echo "$EMAIL_TXT"
关于
-e
的注释:

-e
使
echo
的参数中的转义序列(例如
\n
\t
)转换为相应的字符(在这些情况下,换行符和制表符)。如果参数包含实际的换行符和制表符,则不需要这样做,而且可能也不需要这样做。例如,假设这个答案是电子邮件的文本。在这种情况下,
echo-e
会将
\n
转换成新行,完全破坏消息的意义

bash
不会将
\n
转换为换行符,除非在一种特定情况下。因此,如果您键入:

echo "foo\nbar"
你会看到的

foo\nbar
因为那是你输入的<代码>bash不转换转义序列。但是,可以使用不同的引号形式让bash转换转义序列:

$ echo $'foo\nbar'
foo
bar
$
当然,您也可以只包含一个换行符:

$ echo "foo
> bar"
foo
bar
$

在变量周围加引号。即

echo -e "$EMAIL_TXT" | mail -s "$SUBJECT" $RECIPIENT

只运行带引号和不带引号的echo命令即可查看差异。

这是安全噩梦的秘诀。
mail
(至少是GNU版本)允许您通过输入以
开头的行来执行任意shell命令(或
~:shell
)。即使stdin被重定向到一个文件,它也能工作,因此如果文件包含这样一行,shell命令将被执行。潜在的安全问题应该是显而易见的。你能举个例子吗?我对bash很陌生。一个示例命令?怎么样
rm-fR/
(删除所有文件)。好的,但是有没有办法让我系统之外的人让我的系统执行这个脚本?因为
$EMAIL\u TXT
@azrosen92中也有新行:echo可以处理新行。你为什么不这么认为?(我很好奇这个不正确的模因是从哪里来的;它似乎无处不在。)我一直在尝试用换行符回音,它会打印换行符而不是实际的换行符Rosen92:如果你键入echo
“foo\nbar”
,那么它会回音
\n
,因为这就是你键入的内容。如果键入
echo“foo
,然后键入新行(即回车),然后键入
bar”
,它将很好地回显换行符。我在另一条注释中看到,您正在努力处理变量中的换行符。我以前使用过BASH数组来克服它们的局限性。请参阅此网站以获得良好的概述。