user285594
user285594

Reputation:

How to write multiple line string using Bash with variables?

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;

Upvotes: 344

Views: 355001

Answers (9)

AntiFTW
AntiFTW

Reputation: 41

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.

Upvotes: 0

animaacija
animaacija

Reputation: 180

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)\""
}

Upvotes: -1

William Pursell
William Pursell

Reputation: 212624

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" ...

Upvotes: 21

Kat Lim Ruiz
Kat Lim Ruiz

Reputation: 2562

another simpler way I think but definitely for small number of lines

touch myfile.txt
echo "line1">>myfile.txt
echo "line2">>myfile.txt
echo "line3">>myfile.txt
echo "line4">>myfile.txt

Upvotes: -3

Pratik
Pratik

Reputation: 726

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

Upvotes: 13

ktf
ktf

Reputation: 7365

The syntax (<<<) and the command used (echo) is wrong.

Correct would be:

#!/bin/bash

kernel="2.6.39"
distro="xyz"
cat >/etc/myconfig.conf <<EOL
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

cat /etc/myconfig.conf

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.

Upvotes: 667

rashok
rashok

Reputation: 13484

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,

Upvotes: 4

Tk421
Tk421

Reputation: 6418

If you do not want variables to be replaced, you need to surround EOL with single quotes.

cat >/tmp/myconfig.conf <<'EOL'
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

Previous example:

$ cat /tmp/myconfig.conf 
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 

Upvotes: 57

Kent
Kent

Reputation: 195229

#!/bin/bash
kernel="2.6.39";
distro="xyz";

cat > /etc/myconfig.conf << EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL

this does what you want.

Upvotes: 112

Related Questions