Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Losing newline after assigning grep result to a shell variable

Tags:

shell

People also ask

What is $_ in shell script?

$_ (dollar underscore) is another special bash parameter and used to reference the absolute file name of the shell or bash script which is being executed as specified in the argument list. This bash parameter is also used to hold the name of mail file while checking emails.

What is bash newline?

Before going further, here's a quick refresh on what a newline is. It's usually used to specify the end of a line and to jump to the next line. It's expressed with the character “\n” in UNIX/Linux systems. Most text editors will not show it by default.


You're not losing it in the assignment but in the echo. You can see this clearly if you:

echo "${out}"

You'll see a similar effect with the following script:

x="Hello,
I
am
a
string
with
newlines"
echo "====="
echo ${x}
echo "====="
echo "${x}"
echo "====="

which outputs:

=====
Hello, I am a string with newlines
=====
Hello,
I
am
a
string
with
newlines
=====

And, irrelevant to your question but I'd like to mention it anyway, I prefer to use the $() construct rather than backticks, just for the added benefit of being able to nest commands. So your script line becomes:

out=$(grep apache README)

Now that may not look any different (and it isn't) but it makes possible more complex commands like:

lines_with_nine=$(grep $(expr 7 + 2) inputfile)

Put $out in quotes:

#!/usr/local/bin/bash
out=`grep apache README`
echo "$out";

Quoting variables in bash preserves the whitespace.

For instance:

#!/bin/bash
var1="A B  C   D"
echo $var1   # A B C D
echo "$var1" # A B  C   D

since newlines are whitespace they get "removed"


Combining other answers into a one liner:

echo "($(grep apache README))"

Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!