在 Linux 系统中通过 shell + cat 可以直接讲内容写入到文件中,特别是想通过命令脚本写入时,比交互式的 vim 命令方便多了。但是,当遇到特殊符号 $ 时,总会将内容转义,无法写入正确的内容。本篇给出两种解决方法。

cat + EOF

cat 是一个 bash 命令,用于读取、显示或连接文件的内容,而 EOF 代表 End Of FileEOF 向 shell 表明正在读取的文件已经结束。cat << eof 使用 here-document。重定向运算符 << 和 <<- 都允许将 shell 读取的后续行重定向到命令的输入。重定向的行称为 here-document

写入不包含 $ 等特殊字符的,可以直接使用如下方法:

1
2
3
cat > /home/jinzhongxu/test.service <<EOF
to do something
EOF # 必须保证EOF顶格写

或采用更兼容的形式

1
2
3
cat > /home/jinzhongxu/test.service <<-EOF
to do something
EOF
1
2
3
cat > /home/jinzhongxu/test.service <<-EOF # 这里EOF前带有-,最后的EOF可以不用顶格写
to do something
EOF # 可以不用顶格写

我们还可以使用 cat<<EOF 和 > 以交互方式编写如下所示的 bash 脚本。

1
2
3
4
5
6
cat << EOF > script.sh
#!/bin/bash

printf "Hello\n"

EOF

特殊字符 cat + “EOF”

当书写的内容中有特殊字符的情况,解决方法如下:

  1. 增加反斜杠转义
1
2
3
cat > /home/jinzhongxu/test.service <<-EOF
to do \$something
EOF
  1. 直接转义,在第一个 EOF 左右增加双引号
1
2
3
cat > /home/jinzhongxu/test.service <<-"EOF"
to do $something
EOF

参考文献

  1. Shell中EOF内容转义 - 编程猎人

  2. Bash 中的 Cat EOF | D栈 - Delft Stack