如何在Linux中通过shell脚本自动将数据写入文本文件?
我打开了文件。但是,我不知道如何写入数据。
如何在Linux中通过shell脚本自动将数据写入文本文件?
我打开了文件。但是,我不知道如何写入数据。
当前回答
简单的回答是:
echo "some data for the file" >> fileName
但是,echo不能以理想的方式处理行尾字符。所以,如果你要追加多行,用printf:
printf "some data for the file\nAnd a new line" >> fileName
>>和>操作符对于重定向命令输出非常有用,它们与其他多个bash命令一起使用。
其他回答
我知道这是一个该死的老问题,但由于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
This example causes file poem.txt to be open for reading and writing on file descriptor 3. It also shows that *nix boxes know more fd's then just stdin, stdout and stderr (fd 0,1,2). It actually holds a lot. Usually the max number of file descriptors the kernel can allocate can be found in /proc/sys/file-max or /proc/sys/fs/file-max but using any fd above 9 is dangerous as it could conflict with fd's used by the shell internally. So don't bother and only use fd's 0-9. If you need more the 9 file descriptors in a bash script you should use a different language anyways :)
无论如何,fd可以以许多有趣的方式使用。
#!/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
如果使用变量,可以使用
first_var="Hello"
second_var="How are you"
如果你想连接两个字符串并将其写入文件,那么使用下面的方法
echo "${first_var} - ${second_var}" > ./file_name.txt
你的file_name.txt内容将是"Hello - How are you"
对于这里的文档不可用的环境(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