I need to write some complex xml to a variable inside a bash script. The xml needs to be readable inside the bash script as this is where the xml fragment will live, it's not being read from another file or source.
So my question is this if I have a long string which I want to be human readable inside my bash script what is the best way to go about it?
Ideally I want:
- to not have to escape any of the characters
- have it break across multiple lines making it human readable
- keep it's indentation
Can this be done with EOF or something, could anyone give me an example?
e.g.
String = <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
This will put your text into your variable without needing to escape the quotes. It will also handle unbalanced quotes (apostrophes, i.e.
'
). Putting quotes around the sentinel (EOF) prevents the text from undergoing parameter expansion. The-d''
causes it to read multiple lines (ignore newlines).read
is a Bash built-in so it doesn't require calling an external command such ascat
.You've been almost there. Either you use cat for the assembly of your string or you quote the whole string (in which case you'd have to escape the quotes inside your string):
This should work fine within Bourne shell environment
Yet another way to do the same...
I like to use variables and special
<<-
who drop tabulation at begin of each lines to permit script indentation:warning: there is no blank space before
Some explanations:eof
but only tabulation."${Pattern[*]}"
do cast this array into a string.IFS=";"
because there is no;
in required stringswhile IFS=";" read file ...
preventIFS
to be modified for the rest of the script. In this, onlyread
do use the modifiedIFS
.There are too many corner cases in many of the other answers.
To be absolutely sure there are no issues with spaces, tabs, IFS etc., a better approach is to use the "heredoc" construct, but encode the contents of the heredoc using
uuencode
as explained here:https://stackoverflow.com/questions/6896025/#11379627.