避免在Bash中逃避文件

时间:2014-05-07 13:45:30

标签: bash escaping latex heredoc

如何在Bash here文档中存储文本而不必转义特殊字符?例如,如何修改以下脚本以保留LaTeX代码?:

#!/bin/bash

IFS= read -d '' titlePage << "EOF"
\documentclass{article}
\usepackage{graphicx}
\usepackage{fix-cm}
\begin{document}
\pagestyle{empty}
\vspace*{\fill}
\begin{center}
\hrule
\vspace{1.5 cm}
\textbf{
\fontsize{25}{45}\selectfont
The Title\\
of\\
\fontsize{45}{45}\selectfont
\vspace{0.5 cm}
THIS DOCUMENT\\
\vspace{1.5 cm}
\hrule
\vspace{3.5 cm}
}
\end{center}
\vspace*{\fill}
\end{document}
EOF
echo "${titlePage}" >> 0.tex
pdflatex 0.tex

3 个答案:

答案 0 :(得分:3)

问题不在于这里的文档,而在于read解析其输入的事实。使用read -r应该会有所帮助;或者如果您真的只想在文件中使用此文档,cat <<'here' >file

答案 1 :(得分:2)

声明:

  • 请参阅@tripleee's answer了解正确和最简单的解决方案。
  • 虽然这个答案总是有效,但它最初包含不正确的声明。现在它只是一种替代解决方案。

由于变量被分配到此处,另一个解决方案使用常规 - 但多行 - 单引号字符串文字

titlePage='\documentclass{article}
\usepackage{graphicx}
\usepackage{fix-cm}
\begin{document}
\pagestyle{empty}
\vspace*{\fill}
\begin{center}
\hrule
\vspace{1.5 cm}
\textbf{
\fontsize{25}{45}\selectfont
The Title\\
of\\
\fontsize{45}{45}\selectfont
\vspace{0.5 cm}
THIS DOCUMENT\\
\vspace{1.5 cm}
\hrule
\vspace{3.5 cm}
}
\end{center}
\vspace*{\fill}
\end{document}'

echo "${titlePage}" >> 0.tex
pdflatex 0.tex
字符串中的

空格很重要

  • 内容在开幕'后立即开始。
  • 在最后一个字符后直接放置结束'结束。 - 除非您想要终止\n
  • 此方法无法使用- here-doc选项来剥离前导标签(以便允许缩进以获得视觉清晰度)。

答案 2 :(得分:0)

对于这样的东西,你也可以考虑将它从文件本身中取出来。 它还将您的代码与数据分开。 (这就是我经常使用它的原因。)

#!/bin/sh

titlepage=$(sed '1,/^#START-TITLE/d;/^#END-TITLE/,$d' $0)
....
exit 0

#START-TITLE
.....
#END-TITLE

另请考虑在此缩进doc:

foo <<- \marker
    tab-indented text
    marker

也给(某些)视觉分离。