I searched and tried for days to find the answer to this. All I wanted to do was be able to basically create a file and write text to it exactly as I had entered it in a shell script. Every suggestion on the internet was fubar.
Note : to run these commands, put them in a folder like test.sh and use chmod 755 test.sh to make it executable then type bash test.sh or sh test.sh or /.test.sh
I wanted to put something like this in a file from within a shell script.
Line one text Line two text line three text lets talk about some text
I tried everything. I googled for days and I finally found this article where someone had basically the same need as me. Basically the syntax to put a bunch of text into a file from shell script is this.
#!/bin/bash testFile=/home/akashicseer/tests/test-file.txt if [ ! -e $testFile ]; then touch $testFile fi outside_var="Some text from outside hell" cat <<TEST >> $testFile Line one text Line two text line three text NEWVAR = values lets talk about some $NEWVAR or not but look at some outside text $outside_var TEST
This uses <<HEREDOC syntax but it also redirects the input with >>. This is the oddest syntax I have ever seen so I can’t explain why it works. I would expect the redirect to be at the end of the closing TEST, but that doesn’t work. Bash heredocs are the weirdest thing other than if statements I’ve come across. Learning bash has been like traveling back in time to the 70’s or 80’s the syntax is beyond odd.
Also you will notice I tried defining a variable in the heredoc. That doesn’t work. You can copy and paste the code above and see what I mean. You don’t get errors but the variable doesn’t expand. I don’t know if it is supposed to or not. Here is a link to some info about heredoc. However what you can do is define variables outside the heredoc and use them within, see the $outside_var.
If you read the “info about heredoc” link above( in links below too) it shows this alternate syntax which works too, and makes more sense. I honestly don’t know how or why the above ugly mess works.
#!/bin/bash testFile=/home/akashicseer/tests/test-file.txt if [ ! -e $testFile ]; then touch $testFile fi outside_var="Some text from outside hell" cat > $testFile <<TEST Line one text Line two text line three text but look at some outside text $outside_var TEST
This looks a little better to me than the other version. So there you have it that is how you write lots of text to a file. I had to search for days to figure this out so I hope this saves at least one person some time.