我们经常会碰到这样一个场景:
执行脚本的时候,需要往一个文件里自动输入N行内容。
如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,
单纯用echo追加的方式就显得愚蠢之极。
这个时候,就可以使用EOF结合cat命令进行行内容的追加了!
cat和EOF简介
cat用于显示文本文件内容,全部输出
EOF“end of file”,表示文本结束符
结合这两个标识,即可避免使用多行echo命令的方式,并实现多行输出的结果。
如果不是在脚本中,我们可以用Ctrl-D输出EOF的标识
cat > test.txt
cat >> test.txt
111
222
333
Ctrl-D
####################################
EOF是END Of File的缩写,表示自定义终止符。
既然自定义,那么EOF就不是固定的,可以随意设置别名,在Linux按
Ctrl-D就代表EOF。
EOF一般会配合cat能够多行文本输出,通过cat配合重定向能够生成文件并追加操作。
在它之前先熟悉几个特殊符号:
< 输入重定向
> 输出重定向
>> 输出重定向,进行追加,不会覆盖之前内容
<< 标准输入来自命令行的一对分隔号的中间内容
其用法如下:
<
....
EOF //结束
还可以自定义,比如自定义:
<
....
ABC //结束
# cat << EOF > test.txt
# cat << EOF >> test.txt
# cat >
test.txt << EOF
# cat >> test.txt << EOF
# cat << EOF >test.txt
> Hello!
> This is a test file!
> Test for cat and EOF!
> EOF
看
执行结果:
# cat test.txt
Hello!
This is a test file!
Test for cat and EOF!
#######################################
cat <
两个都是获取stdin,并在EOF处结束stdin,输出stdout。
但是 <<- 是什么意思呢?
先来看man中的说明:
If the redirection operator is <<-, then all leading tab characters are stripped from input lines and the line containing delimiter.
翻译过来的意思就是:
如果重定向的操作符是<<-,那么分界符(EOF)所在行的开头部分的制表符(Tab)都将被去除。
这可以解决由于脚本中的自然缩进产生的制表符。
通俗一点的解释:
在我们使用cat <
EOF必须顶行写,前面不能用制表符或者空格。
比如,下面的语句就不会出错:
# cat <
> Hello,world!
> EOF
Hello,world!
##################
如果结束分解符EOF前有制表符或者空格,则EOF不会被当做结束分界符,只会继续被当做stdin来输入。
而<<-就是为了解决这一问题:
# cat <<-EOF
>Hello,world!
> EOF
Hello,world!
##################
上面的写法,虽然最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束。
这就是<<和<<-的区别。
综合来说,下面是关于cat命令中三个不同输入输出方式的说明:
cat > file:
将输入重定向到文件,并覆盖原有内容。即将用户在终端中输入的内容写入文件中,并覆盖文件中原有的内容。
**举例来说,执行命令cat > example.txt,然后输入一些文本内容并按下回车键,输入完成后使用 Ctrl+D 结束输入,此时该文本内容就被覆盖写入了example.txt文件中。
cat < file << EOF:
从文件中读取输入,并直到遇到EOF(End Of File)为止。即从指定的文件中读取内容,并将其传递给cat命令作为标准输入,直到遇到EOF时结束输入。EOF是自定义的结束标识符,可以使用任意字符或字符串代替,只需保证开始和结束时使用相同的字符或字符串即可。**举例来说,执行命令cat << EOF,然后在终端中输入一些文本内容并按下回车键,然后输入EOF作为结束标识符,输入完成后使用 Ctrl+D结束输入,此时该文本内容就被作为标准输入传递给了cat命令。
cat <<- EOF:
从文件中读取输入,并直到遇到EOF为止。和上述方式类似,区别在于在EOF前添加了一个“-”号,表示忽略所有的前导制表符(Tab)字符。这个方式通常用于在shell脚本中输入多行文本内容。**举例来说,执行命令cat <<- EOF,然后在终端中输入一些文本内容并按下回车键,然后输入EOF作为结束标识符,输入完成后使用 Ctrl+D结束输入,此时该文本内容就被作为标准输入传递给了cat命令,并忽略了所有的前导制表符(Tab)字符。
总之,三种方式的区别在于输入来源和方式不同,使用时需根据具体场景选择合适的方式。
cat > file
和 cat < file
和cat file
命令的用法。
cat > file
:将用户在终端中输入的内容覆盖写入指定的文件中。举例说明:
假设现在需要将终端输入的内容写入到一个名为 “example.txt” 的文件中,可以使用如下命令:
cat > example.txt
执行该命令后,终端会进入一个等待输入的状态,这时可以在终端中输入任何内容,按下回车键表示输入完成。此时输入的内容会被直接覆盖写入到 “example.txt” 文件中。例如,输入:
Hello, World!
This is an example file.
按下回车键后,可以使用 Ctrl + D 组合键来结束输入。此时输入的内容就会被写入到 “example.txt” 文件中。如果想要查看写入的内容,可以使用 cat 命令来打印文件内容,例如:
cat example.txt
输出如下:
Hello, World!
This is an example file.
cat < file
:从指定的文件中读取内容,并将其传递给 cat 命令作为标准输入。举例说明:
假设现在有一个名为 “example.txt” 的文件,其中包含如下内容:
Hello, World!
This is an example file.
如果想要将该文件的内容打印到终端上,可以使用如下命令:
cat < example.txt
执行该命令后,cat 命令会从 “example.txt” 文件中读取内容,并将其作为标准输入传递给 cat 命令。然后,cat 命令会将读取到的内容打印到终端上,输出如下:
Hello, World!
This is an example file.
注意:使用 <
进行输入重定向时,命令会从文件中读取内容,并将其传递给命令作为标准输入,因此命令不需要等待用户的输入,而是直接读取文件内容并进行处理。
3. cat example.txt
命令会直接打印 example.txt
文件的内容到终端上。输出如下:
Hello, World!
This is an example file.
因此,cat < example.txt
和 cat example.txt
命令的输出结果是相同的,但是它们的输入数据来源不同。