シェルスクリプトから文字列を印刷するときにエスケープ文字を無視します。

シェルスクリプトから文字列を印刷するときにエスケープ文字を無視します。

私はLaTeX式をPNGファイルとして保存するための簡単なシェルスクリプトを作成しました。二重バックスラッシュ \\ である "次行" LaTeX 構文を除いて、うまく動作します。

たとえば、入力式が次のような場合:

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

二重バックスラッシュは単一のバックスラッシュに縮小されます。私は式にバックスラッシュを追加できることを知っていますが、式は奇妙なLaTeXベースの組み合わせではなく、本当のLaTeXになりたいです。

私のスクリプト:

#!/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組み込み関数は一部のシェルでバックスラッシュ拡張を実行しますが、明示的に有効にしない限り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。特別な理由がない限り、変数の置換には常に二重引用符を使用してください。

おすすめ記事