1

Is it possible to use a HEREDOC and get variable expansion to happen when the variable is in quotes?

Example: $package is an environment variable that is set before the script runs

#!/bin/bash

cat > out.json <<'EOF'
{
    "apps": [
    {
        "cwd":"/usr/local/$package"
    }
}
EOF

Expected output if $package="www"

{
    "apps": [
    {
        "cwd":"/usr/local/www"
    }
}

1 Answer 1

2

TL;DR

Use <<EOF instead of <<'EOF'.


This is what POSIX says about here-documents [emphasis mine]:

[n]<<word
    here-document
delimiter

[…]

If any part of word is quoted, the delimiter shall be formed by performing quote removal on word, and the here-document lines shall not be expanded. Otherwise, the delimiter shall be the word itself.

If no part of word is quoted, all lines of the here-document shall be expanded for parameter expansion, command substitution, and arithmetic expansion. […]

In you case word is 'EOF' (quoted!), so $package inside the here-document is not expanded. Drop these quotes and you will get the desired result.

cat > out.json <<EOF
{
    "apps": [
    {
        "cwd":"/usr/local/$package"
    }
}
EOF

Note this has nothing to do with quotes that surround the variable inside the here-document.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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