去掉echo中的'n'\ new行到一个文件中

我有一个bash脚本,从外部MySQL数据库中抽取一些文本。 大部分时间是4条线,每条线都在自己的线上。 这个文本(总共)必须放在一个文件中。 该脚本现在从MySQL数据库中提取信息,将其放入一个variables中。 然后我在一个文件中回显它:

echo -ne $variable > file 

问题是'n'也被打印/回显到文件。 喜欢这个:

 here is sentence number 1 nthere is number 2 nals here comes number 3 nlast but not least number 4 

不知何故,有一种新的印刷线,我需要没有“n”的文字。

编辑1 – Bash脚本的副本:

 #!/bin/bash DBHOST='xx.xxx.xx.xxxx' DBUSER='xxxxxx' DBPASS='xxxxxx' DBNAME='xxxxxx' mysql -N -u$DBUSER -p$DBPASS -h$DBHOST -D$DBNAME -e "SELECT id,vhost FROM test;" | while read id vhost; do echo -ne $vhost > vhost done 

由于明显的原因,我删除了数据库的细节

编辑2 – 我使用以下Bash和Ubuntu版本:

Ubuntu:12.04.2 Bash:4.2.25

第一个也是最大的问题是你需要引用你的variables。

 echo -ne "$variable" > file 

然后,我会尝试省略-e-n一个或两个。 理想情况下,应该使用printf而不是echo因为它更便于携带。

编辑:

感谢您展示脚本的其他部分,这对诊断问题至关重要。

如果vhost字段的内容中可能包含文字string“\ n”(反斜杠-n 不是换行符),那么如果要保留反斜杠,则必须使用-r选项。 事实上,你总是应该习惯使用-r 。 通过保留反斜杠, echo-e选项将解释文字 “\ n”作为表示换行符的转义序列,并输出换行符而不是“n”。

 mysql -N -u$DBUSER -p"$DBPASS" -h$DBHOST -D$DBNAME -e "SELECT id,vhost FROM test;" | while read -r id vhost; do echo -en "$vhost" done > vhost 

您可以将redirect移动到while循环的末尾,以避免反复打开和closures输出文件,并在每次迭代时覆盖内容。 您也可以使用拖尾pipe作为续行字符来帮助提高可读性。

我之前提到的习惯,包括总是引用输出variables,应该根深蒂固。 他们防止不合时宜的行为。 Greg Wooledge的BashFAQ和该网站上的其他页面可能是用于学习这些习惯的最佳参考。

  1. 你可能想追加( >> ),而不是覆盖( > )。
  2. 你确定删除-n不起作用吗?
  3. 为什么不:

    mysql -N -u$DBUSER -p$DBPASS -h$DBHOST -D$DBNAME -e "SELECT vhost FROM test;" > vhost