Search code examples
bashshellshzsh

Prevent expansion of \c in echo argument


I'm building a shell script with echo. I have something like:

echo "sed -i \"\\|charlie\.url\\s*=\\s*.*|c\\charlie.url = ${CHARLIE_URL}\" foo.conf" >> bar.sh

i.e. replace the line in foo.conf containing the current charlie.url (not necesarily at the begining, 'cause the line could be commented) for a new line with a new url.

I would expect the output to bar.sh to be

sed -i "\|charlie\.url\s*=\s*.*|c\charlie.url = ${CHARLIE_URL}" foo.conf

Nevertheless, the c\\charlie is interpreted as c \c harlie, instead of c\ charlie, which generates the following output:

sed -i "\|charlie\.url\s*=\s*.*|c

I have found that I could prevent this by using single instead of doubles quotes, but in that case ${CHARLIE_URL} (which I do need to expand) does not get expanded.

How should my echo argument look like?

I'm using dash (#!/bin/sh under Ubuntu), but I could also use bash or zsh.


Solution

  • Instead of echo, you can try cat :

    cat << EOF >> bar.sh
    sed -i "\|charlie\.url\s*=\s*.*|c\charlie.url = ${CHARLIE_URL}" foo.conf
    EOF