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

时间:2012-06-22 18:52:23

标签: bash shell

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

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

11 个答案:

答案 0 :(得分:292)

echo "some data for the file" >> fileName

答案 1 :(得分:119)

#!/bin/sh

FILE="/path/to/file"

/bin/cat <<EOM >$FILE
text1
text2
text3
text4
EOM

答案 2 :(得分:49)

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

$ cat file > copy_file

或追加

$ cat file >> copy_file

如果您想直接写命令echo 'text'

$ echo 'Hello World' > file

答案 3 :(得分:39)

#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 

答案 4 :(得分:19)

我知道这是一个该死的老问题,但由于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

此示例导致文件poem.txt打开以便在文件描述符3上进行读写。它还显示* nix框知道更多fd&#39; s然后只是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可以用很多有趣的方式使用。

答案 5 :(得分:11)

我喜欢这个答案:

cat > FILE.txt <<EOF

info code info 
...
EOF

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

像这样:

cat >> FILE.txt <<EOF

info code info 
...
EOF

答案 6 :(得分:4)

对于此处文档不可用的环境(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

答案 7 :(得分:0)

也可以在这里使用文档和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

答案 8 :(得分:0)

我认为有几个非常好的答案,但是没有所有可能性的简要总结。因此:

此处大多数答案背后的核心原则是redirection。对于写入文件,有两个重要的重定向操作符:

重定向输出:

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

附加重定向输出

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

此处文档

提到的其他内容,也可以通过“此处的文档”以交互方式写入文件,而不是使用echo 'text'这样的固定输入源,有关详细信息,请参见上面的bash手册的链接。那些答案,例如

cat > FILE.txt <<EOFcat >> FILE.txt <<EOF

使用相同的重定向运算符,但通过“此处文档”添加另一层。在以上语法中,您通过cat的输出写入FILE.txt。仅在给交互式输入指定了特定的字符串(在这种情况下为“ EOF”)之后才进行写操作,但这可以是任何字符串,例如:

cat > FILE.txt <<'StopEverything'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'

答案 9 :(得分:0)

这是我的答案。 $ cat文件> copy_file

答案 10 :(得分:0)

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

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

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

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

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