我有一个 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
-e
echo
文字“\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
- 您可能想要附加(
>>
),而不是覆盖(>
)。 - 你确定删除
-n
无效吗? 为什么不:
mysql -N -u$DBUSER -p$DBPASS -h$DBHOST -D$DBNAME -e "SELECT vhost FROM test;" > vhost