I would like to create a longer multiline string in Bash without variable expansion. This text contains also items like ${varname} which is expanded according to the specification. However, I don't want to expand them in my script.
Dockerfile=`cat <<____ ARG BUILD_IMAGE FROM ${BUILD_IMAGE} ... # lots of further lines ____ ` I tried several variants ($\{, $\0173), but I could only solve it with
b='${' ... FROM ${b}BUILD_IMAGE} ... Which is really ugly. Is there any better way to solve this?
Edit:
Dockerfile=`cat <<'____' ARG BUILD_IMAGE FROM ${BUILD_IMAGE} ... # lots of further lines ____ ` would solve the issue, but in this case I can't use any variable expansion.
Edit 2 - Answer:
Since the post has been closed, I answer my question here:
There is a difference between using backquote and $(. The issue is solved if I use the latter one. I had the problem, because I used the former one.
When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by $, `, or . The first backquote not preceded by a backslash terminates the command sub‐ stitution. When using the $(command) form, all characters between the parentheses make up the command; none are treated specially.
This means in praxis:
text=$(cat <<__EOT__ Hello ${who}, hello \${who}! __EOT__ ) echo $text text=`cat <<__EOT__ Hello ${who}, hello \${who}! __EOT__ ` echo $text results in
Hello World, hello ${who}! Hello World, hello World!
<<<syntax).cat.