317

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

我能够打开文件。但是,我不知道如何向它写入数据。

4

13 回答 13

528

简短的回答:

echo "some data for the file" >> fileName

但是,echo不能以理想的方式处理行尾字符 (EOF)。因此,如果您要追加多行,请使用printf

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

>>and运算符对于重定向命令的输出非常>有用,它们可以与多个其他 bash 命令一起使用。

于 2012-06-22T18:59:35.780 回答
165
#!/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
于 2013-08-14T08:40:33.233 回答
69

您可以将命令的输出重定向到文件:

$ cat file > copy_file

或附加到它

$ cat file >> copy_file

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

$ echo 'Hello World' > file
于 2012-06-22T22:57:44.310 回答
58
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 
于 2014-04-24T20:58:52.000 回答
29

我知道这是一个该死的老问题,但是由于 OP 是关于脚本的,而且由于 google 把我带到这里的事实,还应该提到同时打开文件描述符以进行读取和写入。

#!/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

此示例导致打开文件poem.txt 以对文件描述符3 进行读写。它还表明*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 可以以许多有趣的方式使用。

于 2017-05-27T21:50:39.237 回答
17

我喜欢这个答案:

cat > FILE.txt <<EOF

info code info 
...
EOF

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

像这样:

cat >> FILE.txt <<EOF

info code info 
...
EOF
于 2016-01-14T04:16:52.583 回答
11

根据@lycono 的要求,将我的评论作为答案

如果您需要使用 root 权限执行此操作,请执行以下操作:

sudo sh -c 'echo "some data for the file" >> fileName'
于 2017-05-07T11:47:29.650 回答
11

对于此处文档不可用的环境(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
于 2018-06-02T06:31:09.697 回答
9

我认为有一些非常好的答案,但没有对所有可能性的简明总结;因此:

大多数答案背后的核心原则是重定向。两个是写入文件的重要重定向运算符:

重定向输出:

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

附加重定向输出

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

这里的文件

echo 'text'其他人提到,您也可以通过“Here Document”交互式地写入文件,而不是从固定输入源(如. 那些答案,例如

cat > FILE.txt <<EOF或者cat >> FILE.txt <<EOF

使用相同的重定向运算符,但通过“Here Documents”添加另一层。在上述语法中,您通过cat. 仅在给交互式输入提供一些特定字符串(在本例中为“EOF”)后才进行写入,但这可以是任何字符串,例如:

cat > FILE.txt <<'StopEverything'或者cat >> FILE.txt <<'StopEverything'

也可以。这里 Documents 还寻找各种分隔符和其他有趣的解析字符,因此请查看文档以获取更多信息。

这里字符串

有点令人费解,更多的是理解重定向和 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'

于 2019-11-21T04:24:45.640 回答
0

如果你使用变量,你可以使用

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

如果要连接两个字符串并将其写入文件,请在下面使用

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

您的 file_name.txt 内容将是“你好 - 你好吗”

于 2021-02-03T16:04:15.223 回答
0

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

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
于 2019-07-05T11:55:42.247 回答
0

这种方法有效并且是最好的

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

基本上,文本将搜索关键字“EOF”,直到它终止写入/附加文件

于 2022-03-02T07:21:36.750 回答
-5

这是我的回答。$ 猫文件 > 复制文件

于 2019-11-27T05:22:52.797 回答