Ail*_*rus 5 bash shell-script quoting
我刚刚编写了一个简单的 shell 脚本来将 LaTeX 表达式保存为 PNG 文件。它工作正常,除了“下一行”的 LaTeX 语法,即双反斜杠 \\。
例如,当我的输入表达式是这样的:
\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)
Run Code Online (Sandbox Code Playgroud)
双反斜杠减少为一个。我知道我可以在表达式中添加更多反斜杠,但我希望这些表达式是真正的 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
Run Code Online (Sandbox Code Playgroud)
那么,如何忽略转义字符并从字面上打印我的 LaTeX 表达式?最好不使用 sed。
所有字符均按字面意思解释在单引号之间。您使用了双引号,并且某些字符 ( $"\\`) 在双引号之间进行解释。请参阅\n环境变量中单引号和双引号的意义是什么?不过,您问题中的示例恰好从未使用有问题的字符。您避免使用的其他潜在问题echo(echo内置函数在某些 shell 中执行反斜杠扩展,但在 bash 中则不然,除非您显式启用它),并且$1(echo $1将执行反斜杠扩展;echo "$1"在bash)。
一种安全、可移植的逐字打印字符串的方法是
\n\nprintf \'%s\\n\' "$1"\nRun Code Online (Sandbox Code Playgroud)\n\n\\n如果您不想在字符串后添加换行符,请将其删除。
这是你真正的代码吗?如果是,请确保问题不在于您传递参数 \xe2\x80\x94 的方式,您应该编写类似的内容
\n\nmyscript \'\\left( \\begin{array}{cc}1 & 2\\\\ 3 & 4\\end{array} \\right)\' filename\nRun Code Online (Sandbox Code Playgroud)\n\n如果您需要在 TeX 代码片段中使用单引号,则必须将其转义:\'\\\'\'。
您可能对此处的文档感兴趣,它可以让您方便地在源文件中包含多行字符串。或者您可以在单引号中包含多行字符串。
\n\nprintf \'%s\' \'\\documentclass{article}\n\\usepackage[utf8x]{inputenc}\n\\pagestyle{empty}\n\\begin{document}\n\\[ \'"$1"\' \\]\n\\end{document}\n\' >"/tmp/$2.tex"\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,您也应该使用双引号$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
Run Code Online (Sandbox Code Playgroud)
cat和标记之间的数据END将按原样输出,不进行替换。(我假设添加的所有换行符都可以。)
确保'在将 TeX 作为参数传递时使用硬引号 ( ):
./your_script '\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16566 次 |
| 最近记录: |