Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

I have a bash script that pulls a bit of text from an external MySQL database. Most of the times it are 4 lines, each one on his own line. This text (in total) has to be placed into a file. The script now pulls the information from the MySQL database, puts it in a variable. Then I echo it in a file:

echo -ne $variable > file

The problem is that the 'n' gets also printed/echo'ed to the file. Like this:

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

somehow there is a kind of new-line that is printed and I need to have the text without the 'n'.

EDIT 1 - copy of the Bash script:

#!/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

For obvious reasons I removed the database details.

EDIT 2 - I am using the following Bash and Ubuntu version:

Ubuntu: 12.04.2 Bash: 4.2.25

share|improve this question

closed as off topic by quanta, mdpc, Ward, Ladadadada, Hauke Laging Jun 6 '13 at 21:04

Questions on Server Fault are expected to relate to server, networking, or related infrastructure administration within the scope defined by the community. Consider editing the question or leaving comments for improvement if you believe the question can be reworded to fit within the scope. Read more about reopening questions here.If this question can be reworded to fit the rules in the help center, please edit the question.

    
The script now pulls the information from the MySQL database, puts it in a variable. --> How did you do this? Could you please show us your code? –  quanta Jun 5 '13 at 16:24
    
I edited my post with the Bash script. –  Jona Koudijs Jun 5 '13 at 18:56
    
Why do you use -e, why no quotes? What is the content of the variables? echo -n "$variable" | od -t c -t x1 –  Hauke Laging Jun 6 '13 at 21:04

2 Answers 2

up vote 3 down vote accepted

The first and biggest problem is that you need quotes around your variable.

echo -ne "$variable" > file

Then I would try omitting one or both of the -e and -n. Ideally, printf should be used instead of echo since it's more portable.

Edit:

Thanks for showing additional parts of your script which are essential in diagnosing the issue.

If the vhost field may contain the literal string "\n" (backslash-n not a newline) in its contents then you must use the -r option with read if you want to preserve the backslash. In fact, you should almost always use the -r anyway out of habit. By preserving the backslash, the -e option of echo will interpret the literal "\n" as the escape sequence which represents a newline and output a newline instead of an "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

You can move the redirection to the end of the while loop to avoid repeatedly opening and closing the output file and overwriting the contents on each iteration. You can use the trailing pipe also as a line continuation character to aid in readability.

The habits I mentioned earlier, including always quoting a variable for output, should be well ingrained. They prevent unexpected behavior at inopportune times. Probably the best reference to use in learning these habits is Greg Wooledge's BashFAQs and other pages at that site.

share|improve this answer
    
I already tried that. Probably a habbit that I did not include the quotes. I tested it again a few minutes ago just to be sure, it still includes the 'n'. –  Jona Koudijs Jun 5 '13 at 18:59
    
It also makes no difference if I dont use the -e, dont use the -n or dont use them both. If I would like to use printf instead, what kind of command I would create? –  Jona Koudijs Jun 5 '13 at 19:07
    
pipe it into tr. echo "$variable" | tr -d '\n' > file –  Sirex Jun 5 '13 at 21:11
    
@JonaKoudijs: Please see my edited answer. –  Dennis Williamson Jun 6 '13 at 2:18
    
Thank you very much for your answer. I have been playing around a little more but it still doesn't work. If I add the -r after 'read' I get '\n' after every line instead of 'n'. –  Jona Koudijs Jun 6 '13 at 7:50
  1. You probably want to append (>>), not overwrite (>).
  2. Are you sure that removing -n doesn't work?
  3. Why not:

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

share|improve this answer
    
I want to overwrite the file not append it. I am 100% positive. The script will be bigger en there a couple of other things that will get included in the loop part. So this way is better for me. –  Jona Koudijs Jun 6 '13 at 7:56

Not the answer you're looking for? Browse other questions tagged or ask your own question.