从回显中删除“n”\新行并将其保存到文件中

从回显中删除“n”\新行并将其保存到文件中

我有一个 bash 脚本,它从外部 MySQL 数据库中提取一些文本。大多数情况下,它是 4 行,每行占一行。这个文本(总共)必须放入一个文件中。该脚本现在从 MySQL 数据库中提取信息,并将其放入一个变量中。然后我将其回显到一个文件中:

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

答案1

第一个也是最大的问题是您需要用引号括住变量。

echo -ne "$variable" > file

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

编辑:

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

如果 vhost 字段可能包含文字字符串“\n”(反斜杠-n不是换行符)内容然后你必须如果要保留反斜杠,请使用-r选项 with 。事实上,出于习惯,您几乎总是应该使用 。通过保留反斜杠,选项会将read-r-eecho文字“\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

您可以将重定向移至循环末尾,while以避免在每次迭代中反复打开和关闭输出文件并覆盖内容。您还可以使用尾随管道作为行继续符,以提高可读性。

我之前提到的习惯,包括始终引用变量以进行输出,应该根深蒂固。它们可以防止在不合适的时间出现意外行为。学习这些习惯的最佳参考可能是Greg Wooledge 的 BashFAQs以及该网站的其他页面。

答案2

  1. 您可能想要附加(>>),而不是覆盖(>)。
  2. 你确定删除-n无效吗?
  3. 为什么不:

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

相关内容