Home > Software design >  evaluate bash variables in nested cat
evaluate bash variables in nested cat

Time:04-22

I have a shell script that looks like

#/bin/bash

file=File1.sh

cat > ${file} << EOF
file2=subCat
cat > ${file2} << END
echo hello
END

EOF

Which produces File1.sh with the contents:


file2=subCat

cat> << END
echo hello
END

How can I get ${file2} to be evaluated as subCat in the output file?

CodePudding user response:

Here's an easier way to reproduce your problem:

echo "var=foo"
echo $var

It outputs nothing instead of foo. This is because outputting a value with an equals sign is not the same as actually assigning a value.

What you asked can be done by assigning the variable first instead of outputting it:

#/bin/bash

file=File1.sh
file2=subCat

cat > ${file} << EOF
cat > ${file2} << END
echo hello
END
EOF

This will make File1.sh contain

cat > subCat << END
echo hello
END

What you maybe should have asked is how to make the expansion happen in File1.sh instead. You can do this by escaping the expansion:

#/bin/bash

file=File1.sh

cat > ${file} << EOF
file2=subCat
cat > \${file2} << END
echo hello
END
EOF

This will make File1.sh contain

file2=subCat
cat > ${file2} << END
echo hello
END

If you want all expansions to happen in the script, you can also simply quote 'EOF' instead of each individual one.

  • Related