Shell - Write variable contents to a file
Use the echo
command:
var="text to append";
destdir=/some/directory/path/filename
if [ -f "$destdir" ]
then
echo "$var" > "$destdir"
fi
The if
tests that $destdir
represents a file.
The >
appends the text after truncating the file. If you only want to append the text in $var
to the file existing contents, then use >>
instead:
echo "$var" >> "$destdir"
The cp
command is used for copying files (to files), not for writing text to a file.
Writing variables to file with bash
Enclose the strings you want to write within single quotes to avoid variable replacement.
> FOO=bar
> echo "$FOO"
bar
> echo '$FOO'
$FOO
>
How to read a file into a variable in shell?
In cross-platform, lowest-common-denominator sh
you use:
#!/bin/sh
value=`cat config.txt`
echo "$value"
In bash
or zsh
, to read a whole file into a variable without invoking cat
:
#!/bin/bash
value=$(<config.txt)
echo "$value"
Invoking cat
in bash
or zsh
to slurp a file would be considered a Useless Use of Cat.
Note that it is not necessary to quote the command substitution to preserve newlines.
See: Bash Hacker's Wiki - Command substitution - Specialities.
Write variables to a file which contains the variabe name and value
You can use sed
to do the job.
!/bin/bash
echo "Read"
var1=$(grep -Po "(?<=^var1=).*" data.txt)
echo "Do Something"
var2=${var1}
echo "Write"
sed -i "/var2/ s/.*/var2=${var2}/" data.txt # replace the line contains 'var2' with var2=2
I assume you use GNU sed, for BSD sed, you need to feed an extra suffix to -i.
Open and write data to text file using Bash?
The short answer:
echo "some data for the file" >> fileName
However, echo
doesn't deal with end of line characters (EOFs) in an ideal way. So, if you're gonna append more than one line, do it with printf
:
printf "some data for the file\nAnd a new line" >> fileName
The >>
and >
operators are very useful for redirecting output of commands, they work with multiple other bash commands.
Need to assign the contents of a text file to a variable in a bash script
In bash, $ (< answer.txt)
is equivalent to $ (cat answer.txt)
, but built in and thus faster and safer. See the bash manual.
I suspect you're running this print
:
NAME
run-mailcap, see, edit, compose, print − execute programs via entries in the mailcap file
File content into unix variable with newlines
The assignment does not remove the newline characters, it's actually the echo
doing this. You need simply put quotes around the string to maintain those newlines:
echo "$testvar"
This will give the result you want. See the following transcript for a demo:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
The reason why newlines are replaced with spaces is not entirely to do with the echo
command, rather it's a combination of things.
When given a command line, bash
splits it into words according to the documentation for the IFS
variable:
IFS: The Internal Field Separator that is used for word splitting after expansion ... the default value is
<space><tab><newline>
.
That specifies that, by default, any of those three characters can be used to split your command into individual words. After that, the word separators are gone, all you have left is a list of words.
Combine that with the echo
documentation (a bash
internal command), and you'll see why the spaces are output:
echo [-neE] [arg ...]: Output the args, separated by spaces, followed by a newline.
When you use echo "$x"
, it forces the entire x
variable to be a single word according to bash
, hence it's not split. You can see that with:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
Here, the count
function simply prints out the number of arguments given. The 1 2 3
and a b c d
variants show it in action.
Then we try it with the two variations on the x
variable. The one without quotes shows that there are four words, "test"
, "1"
, "test"
and "2"
. Adding the quotes makes it one single word "test 1\ntest 2"
.
How to echo $variable into text file within a loop
If you use
echo " $i" >> fail
It will append it to the file.
Related Topics
Differencebetween Double-Ampersand (&&) and Semicolon (;) in Linux Bash
How to Script a "Yes" Response for Installing Programs
Linux Terminal Input: Reading User Input from Terminal Truncating Lines at 4095 Character Limit
Don't Fail Jenkins Build If Execute Shell Fails
Negate If Condition in Bash Script
Creating Temporary Files in Bash
How Pthread_Mutex_Lock Is Implemented
How Find Out Which Process Is Using a File in Linux
Prevent File Descriptors Inheritance During Linux Fork
What Is the Default Register State When Program Launches (Asm, Linux)
Get Free Disk Space with Df to Just Display Free Space in Kb
Does Linux Schedule a Process or a Thread
Linux: Find All Symlinks of a Given 'Original' File? (Reverse 'Readlink')