我们经常会碰到这样一个场景:

执行脚本的时候,需要往一个文件里自动输入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 > filecat < filecat file命令的用法。

  1. 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.
  1. 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.txtcat example.txt 命令的输出结果是相同的,但是它们的输入数据来源不同。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐