如何在 Linux 中通过 shell 脚本自动将数据写入文本文件?
我能够打开文件。但是,我不知道如何向它写入数据。
简短的回答:
echo "some data for the file" >> fileName
但是,echo
不能以理想的方式处理行尾字符 (EOF)。因此,如果您要追加多行,请使用printf
:
printf "some data for the file\nAnd a new line" >> fileName
>>
and运算符对于重定向命令的输出非常>
有用,它们可以与多个其他 bash 命令一起使用。
#!/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
您可以将命令的输出重定向到文件:
$ cat file > copy_file
或附加到它
$ cat file >> copy_file
如果你想直接写命令是echo 'text'
$ echo 'Hello World' > file
#!/bin/bash
cat > FILE.txt <<EOF
info code info
info code info
info code info
EOF
我知道这是一个该死的老问题,但是由于 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 可以以许多有趣的方式使用。
我喜欢这个答案:
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'
对于此处文档不可用的环境(Makefile
、Dockerfile
等),您通常可以使用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
我认为有一些非常好的答案,但没有对所有可能性的简明总结;因此:
大多数答案背后的核心原则是重定向。两个是写入文件的重要重定向运算符:
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 >> 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 内容将是“你好 - 你好吗”
也可以使用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
这种方法有效并且是最好的
cat > (filename) <<EOF
Text1...
Text2...
EOF
基本上,文本将搜索关键字“EOF”,直到它终止写入/附加文件
这是我的回答。$ 猫文件 > 复制文件