139

I need to create a text file (unless it already exists) and write a new line to the file all using bash.

I'm sure it's simple, but could anyone explain this to me?

1

9 Answers 9

167

Creating a text file in unix can be done through a text editor (vim, emacs, gedit, etc). But what you want might be something like this

echo "insert text here" > myfile.txt

That will put the text 'insert text here' into a file myfile.txt. To verify that this worked use the command 'cat'.

cat myfile.txt

If you want to append to a file use this

echo "append this text" >> myfile.txt
Sign up to request clarification or add additional context in comments.

Comments

55

If you're wanting this as a script, the following Bash script should do what you want (plus tell you when the file already exists):

#!/bin/bash
if [ -e $1 ]; then
  echo "File $1 already exists!"
else
  echo >> $1
fi

If you don't want the "already exists" message, you can use:

#!/bin/bash
if [ ! -e $1 ]; then
  echo >> $1
fi

Edit about using:

Save whichever version with a name you like, let's say "create_file" (quotes mine, you don't want them in the file name). Then, to make the file executatble, at a command prompt do:

chmod u+x create_file

Put the file in a directory in your path, then use it with:

create_file NAME_OF_NEW_FILE

The $1 is a special shell variable which takes the first argument on the command line after the program name; i.e. $1 will pick up NAME_OF_NEW_FILE in the above usage example.

2 Comments

Could I replace it with "text.txt"?
@Switz: See edit explaining $1. If you replace $1 in the script with "text.txt", it will always use "text.txt" as the filename.
27
#!/bin/bash
file_location=/home/test/$1.json
if [ -e $policy ]; then
  echo "File $1.json already exists!"
else
  cat > $file_location <<EOF
{
      "contact": {
          "name": "xyz",
          "phonenumber":   "xxx-xxx-xxxx"
      }
    }
EOF
fi

This code checks if the given JSON file of the user is present in test home directory or not. If it's not present it will create it with the content. You can modify the file location and content according to your needs.

Comments

23

Assuming you mean UNIX shell commands, just run

echo >> file.txt

echo prints a newline, and the >> tells the shell to append that newline to the file, creating if it doesn't already exist.

In order to properly answer the question, though, I'd need to know what you would want to happen if the file already does exist. If you wanted to replace its current contents with the newline, for example, you would use

echo > file.txt

EDIT: and in response to Justin's comment, if you want to add the newline only if the file didn't already exist, you can do

test -e file.txt || echo > file.txt

At least that works in Bash, I'm not sure if it also does in other shells.

3 Comments

+1. I think there's 1 other possible interpretation: create and write a newline if the file doesn't yet exist, else don't modify the file at all.
@Justin: good point, I guess I can add that one too and we'll have all the options covered.
This was by far the clearest explanation to me. Minimum commands and an accurate explanation of what they do.
6
echo -e "Hello there, new line!" >> new_file.txt

or

cat <<EOF | sudo tee /etc/test.txt
Hello World
EOF

1 Comment

But you show two different command with two differents effects: The first will append while second will replace content! Consider -a switch of tee and/or having only one > redirector instead of two!!
3

Your question is a a bit vague. This is a shell command that does what I think you want to do:

echo >> name_of_file

Comments

1
cat my_file.txt | cat > new_file.txt

Create a ".sh" file and drop this command there, then run))

This will put the output of my_file to new_file and by the way will create it.

Instead of cat my_file.txt you can put any text, it automatically will be send to new_file.

1 Comment

Hem cat | cat is a useless fork! cat my_file.txt >new_file.txt will do same!!
0

"Touch" command also could be used for creating a file.
Example:

touch new_file.txt

This command will create new file new_file.txt in current folder.

2 Comments

But touch won't fill the file!!
Thank you for your valuable comment and sorry for the inappropriate comment...
0

If you want to use one-liners

To execute some command if logical comparison is true:

[ -e myfile.txt ] && echo "myfile.txt already exists!"

Logical operator "AND" (&&) always executes the first command and only if exit status of that command is Success (0) then the next command is executed.

Or reversely execute command of logical comparison is false

[ -e myfile.txt ] || echo "insert text here" > myfile.txt

Logical operator "OR" (||) always executes the first command and only if exit status command is NOT Success (0) then the next command is executed.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.