Friday, April 29, 2011

Losing newline after assigning grep result to a shell variable

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

Usually grep shows each match on a separate line when run on the command line. However, in the above scripts, the newline separating each match disappears. Does anyone know how the newline can be preserved?

From stackoverflow
  • Put $out in quotes:

    #!/usr/local/bin/bash
    out=`grep apache README`
    echo "$out";
    
  • 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)
    
    Tanj : I didn't know you could do that with $()... learn something new all the time here.
    Barry Brown : You can do math without using expr. Just use double-parens: $((7 + 2))
    paxdiablo : Actually I might try that with all my answers from now on - append a (not always totally) relevant snippet for the education of the swarm :-)
    paxdiablo : Good point, Barry, but it was just an example of nesting - my example-generating skills appear to have deteriorated with age (and/or alcohol :-).
    Barry Brown : I just found out about the $(()) thing, myself.
  • 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"

0 comments:

Post a Comment

Note: Only a member of this blog may post a comment.