使用Bash打开并写入数据到文本文件?

如何在Linux中通过shell脚本自动将数据写入文本文件?

我打开了文件。但是,我不知道如何写入数据。

905202 次浏览

简单的回答是:

echo "some data for the file" >> fileName

然而,echo没有以理想的方式处理行尾字符(eof)。因此,如果要追加多行,请使用printf:

printf "some data for the file\nAnd a new line" >> fileName

>>>操作符对重定向命令输出非常有用,它们与其他多个bash命令一起使用。

你可以将命令的输出重定向到一个文件:

$ cat file > copy_file

或者附加到它

$ cat file >> copy_file

如果你想直接写入,命令是echo 'text'

$ echo 'Hello World' > file
#!/bin/sh


FILE="/path/to/file"


/bin/cat <<EOM >$FILE
text1
text2 # This comment will be inside of the file.
The keyword EOM can be any text, but it must start the line and be alone.
EOM # This will be also inside of the file, see the space in front of EOM.
EOM # No comments and spaces around here, or it will not work.
text4
EOM
#!/bin/bash


cat > FILE.txt <<EOF


info code info
info code info
info code info


EOF

我喜欢这个答案:

cat > FILE.txt <<EOF


info code info
...
EOF

但如果你只是想在文件末尾添加一些内容,而不清除已经存在的内容,则建议cat >> FILE.txt << EOF

是这样的:

cat >> FILE.txt <<EOF


info code info
...
EOF

移动我的评论作为一个答案,由@lycono要求

如果你需要用root权限来做这件事,这样做:

sudo sh -c 'echo "some data for the file" >> fileName'

我知道这是一个该死的老问题,但由于OP是关于脚本的,而且谷歌将我带到了这里,因此还应该提到同时打开文件描述符以进行读写。

#!/bin/bash


# Open file descriptor (fd) 3 for read/write on a text file.
exec 3<> poem.txt


# Let's print some text to fd 3
echo "Roses are red" >&3
echo "Violets are blue" >&3
echo "Poems are cute" >&3
echo "And so are you" >&3


# Close fd 3
exec 3>&-

然后在终端上cat文件

$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you

这个例子导致在文件描述符3上打开文件poem.txt以供读写。它还表明*nix盒子知道更多的fd,然后只是stdin, stdout和stderr (fd 0,1,2)。它能装很多东西。通常内核可以分配的文件描述符的最大数量可以在/proc/sys/file-max/proc/sys/fs/file-max中找到,但是使用任何超过9的fd都是危险的,因为它可能与shell内部使用的fd冲突。所以不用麻烦,只用fd的0-9。如果你在bash脚本中需要更多的9个文件描述符,你应该使用不同的语言:)

无论如何,fd可以以许多有趣的方式使用。

对于这里的文档不可用的环境(MakefileDockerfile等),您通常可以使用printf来获得合理清晰且高效的解决方案。

printf '%s\n' '#!/bin/sh' '# Second line' \
'# Third line' \
'# Conveniently mix single and double quotes, too' \
"# Generated $(date)" \
'# ^ the date command executes when the file is generated' \
'for file in *; do' \
'    echo "Found $file"' \
'done' >outputfile

也可以使用这里的文档和vi,下面的脚本生成一个FILE.txt 3行和变量插值

VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX

然后文件将有如下3行。“i”是启动vi插入模式,类似地用Esc和ZZ关闭文件。

#This is my var in text file
var = Test
#Thats end of text file

我想有几个非常好的答案,但没有对所有可能性的简明总结;因此:

这里大多数答案背后的核心原则是重定向。有两个重要的重定向操作符用于写入文件:

重定向输出:

echo 'text to completely overwrite contents of myfile' > myfile

追加重定向输出

echo 'text to add to end of myfile' >> myfile

这里的文档

其他提到的,而不是从像echo 'text'这样的固定输入源,你也可以通过&;Here document &;交互式地写入文件,这在上面的bash手册链接中也有详细说明。那些答案,例如:

cat > FILE.txt <<EOF` or `cat >> FILE.txt <<EOF

使用相同的重定向操作符,但通过“Here Documents"”添加另一层。在上面的语法中,你通过cat的输出写入FILE.txt。写入只发生在交互式输入给定某个特定字符串之后,在这种情况下是'EOF',但这可以是任何字符串,例如:

cat > FILE.txt <<'StopEverything'` or `cat >> FILE.txt <<'StopEverything'

效果也一样。在这里,文档还查找各种分隔符和其他有趣的解析字符,因此请查看文档以获得有关这方面的进一步信息。

这里的字符串

这有点复杂,更多的是在理解重定向和Here Documents语法方面的练习,但你可以将Here Document样式的语法与标准重定向操作符结合起来,成为Here String:

重定向cat输入的输出

cat > myfile <<<'text to completely overwrite contents of myfile'

追加cat输入的重定向输出

cat >> myfile <<<'text to completely overwrite contents of myfile'

如果使用变量,可以使用

first_var="Hello"
second_var="How are you"

如果你想连接两个字符串并将其写入文件,那么使用下面的方法

echo "${first_var} - ${second_var}" > ./file_name.txt

你的file_name.txt内容将是“Hello - How are you"

这种方法是有效的,也是最好的

cat > (filename) <<EOF
Text1...
Text2...
EOF

基本上文本会搜索关键词"EOF"直到它终止写入/追加文件