在 shell 脚本中打印字符串时忽略转义字符

在 shell 脚本中打印字符串时忽略转义字符

我刚刚编写了一个简单的 shell 脚本来将 LaTeX 表达式保存为 PNG 文件。它工作得很好,除了“下一行”的 LaTeX 语法,即双反斜杠 \\。

例如,当我的输入表达式是这样的:

\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)

双反斜杠减少为单反斜杠。我知道我可以在表达式中添加更多反斜杠,但我希望这些表达式是真正的 LaTeX,而不是一些奇怪的 LaTeX-bash 组合。

我的脚本:

#!/bin/bash

if [ $# -ne 2 ]; then
    echo -e "Er moeten twee argumenten worden opgegeven:\n(1) LaTeX code\n(2) Bestandsnaam zonder extensie"
else
    SaveDir="/home/pieter"
    echo "\documentclass{article}\usepackage[utf8x]{inputenc}\pagestyle{empty}\begin{document}\[ $1 \]\end{document}" > /tmp/$2.tex
    latex -output-directory /tmp -interaction=batchmode $2.tex
    dvips -o /tmp/$2.ps -E /tmp/$2.dvi
    convert -units PixelsPerInch -density 200 /tmp/$2.ps -trim $SaveDir/$2.png
fi

那么,我怎样才能忽略转义字符并按字面意思打印我的 LaTeX 表达式呢?最好不使用 sed。

答案1

所有字符均按字面意思解释在单引号之间。您使用了双引号,并且某些字符 ( $"\`) 在双引号之间进行解释。看 环境变量中的单引号和双引号有何意义?不过,您问题中的示例恰好从未使用有问题的字符。您避免使用的其他潜在问题echoecho内置函数在某些 shell 中执行反斜杠扩展,但在 bash 中则不然,除非您明确启用它),并且$1(echo $1会执行反斜杠扩展;echo "$1"在 bash 中则不会) )。

一种安全、可移植的逐字打印字符串的方法是

printf '%s\n' "$1"

\n如果您不想在字符串后添加换行符,请将其删除。

这是你真正的代码吗?如果是,请确保问题不在于您传递参数的方式 - 您应该写类似的内容

myscript '\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)' filename

如果您需要在 TeX 代码片段中使用单引号,则必须将其转义:'\''

您可能感兴趣这里的文档构造,这将允许您方便地在源文件中包含多行字符串。或者您可以在单引号中包含多行字符串。

printf '%s' '\documentclass{article}
\usepackage[utf8x]{inputenc}
\pagestyle{empty}
\begin{document}
\[ '"$1"' \]
\end{document}
' >"/tmp/$2.tex"

请注意,您也应该使用双引号$2。始终在变量替换周围使用双引号,除非您有充分的理由不这样做。

答案2

如果你想要输出的 TeX 在你的脚本中是固定的,最安全的方法是使用这样的东西:

cat > $2.tex << 'ENDHEADER'
\documentclass{article}
 \usepackage[utf8x]{inputenc}
 \pagestyle{empty}
\begin{document}
\[
ENDHEADER
echo $1 >> $2.tex
cat >> $2.tex << 'ENDFOOTER'
\]
\end{document}
ENDFOOTER

cat和标记之间的数据END将按原样输出,不进行替换。 (我假设添加的所有换行符都可以。)

确保'在将 TeX 作为参数传递时使用硬引号 ( ):

./your_script '\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)'

相关内容