我有一个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和该网站上的其他页面可能是用于学习这些习惯的最佳参考。
>> ),而不是覆盖( > )。 -n不起作用吗? 为什么不:
mysql -N -u$DBUSER -p$DBPASS -h$DBHOST -D$DBNAME -e "SELECT vhost FROM test;" > vhost