How can I write multi-lines in a file called myconfig.conf
using BASH?
#!/bin/bash
kernel="2.6.39";
distro="xyz";
echo <<< EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL >> /etc/myconfig.conf;
cat /etc/myconfig.conf;
The heredoc solutions are certainly the most common way to do this. Other common solutions are:
echo 'line 1, '"${kernel}"'
line 2,
line 3, '"${distro}"'
line 4' > /etc/myconfig.conf
and
exec 3>&1 # Save current stdout
exec > /etc/myconfig.conf
echo line 1, ${kernel}
echo line 2,
echo line 3, ${distro}
...
exec 1>&3 # Restore stdout
and
printf "%s\n" "line1, ${kernel}" "line2," "line3, $distro" ...
I usually put template in file and use this templating engine:
### <template-file> [ARG=VALUE..]
## Variables are replaced only within "{{" and "}}" notation.
## Example:
## $0 path-to-tmpl REF=master pass=xx
## # The template may look like so:
## # $pass = ["user", "{{ $pass }}"];
## # Resulting in:
## # $pass = ["user", "xxx"];
##~
template() {
tmpl=$1
shift
for i in $@; do
declare $i;
done
eval "echo \"$(sed -e 's/"/\\"/g' -e 's/\$/\\$/g' -e 's/{{\s*\\\(\$\w*\)\s*}}/\1/g' $tmpl)\""
}
In my usecase I had to use the following:
{
...
printf "Suites: $SUITES"
printf "Components: $COMPONENTS"
printf "Signed-By: $SIGNATURE"
[ ! -z "$ARCH_STRING" ] && printf "$ARCH_STRING"
[ ! -z "$LANG_STRING" ] && printf "$LANG_STRING"
[ ! -z "$TARGET_STRING" ] && printf "$TARGET_STRING"
...
} > /tmp/myconfig.conf
This because I did not want to write empty newlines to the file if the variables were not defined. The nice thing about this method is that you can write all kinds of arbitrary logic within the block if necessary.
And ofcourse, if you would like to append, you can also use >>
here instead of >
like you would in the other answers.
I'm using Mac OS and to write multiple lines in a SH Script following code worked for me
#! /bin/bash
FILE_NAME="SomeRandomFile"
touch $FILE_NAME
echo """I wrote all
the
stuff
here.
And to access a variable we can use
$FILE_NAME
""" >> $FILE_NAME
cat $FILE_NAME
Please don't forget to assign chmod as required to the script file. I have used
chmod u+x myScriptFile.sh
Below mechanism helps in redirecting multiple lines to file. Keep complete string under "
so that we can redirect values of the variable.
#!/bin/bash
kernel="2.6.39"
echo "line 1, ${kernel}
line 2," > a.txt
echo 'line 2, ${kernel}
line 2,' > b.txt
Content of a.txt
is
line 1, 2.6.39
line 2,
Content of b.txt
is
line 2, ${kernel}
line 2,
The syntax (
<<<
) and the command used (echo
) is wrong.Correct would be:
This construction is referred to as a Here Document and can be found in the Bash man pages under
man --pager='less -p "\s*Here Documents"' bash
.