Ignora os caracteres de escape ao imprimir uma string no shell script

4

Acabei de escrever um script de shell simples para salvar uma expressão LaTeX como um arquivo PNG. Ele funciona bem, exceto pela sintaxe LaTeX para "próxima linha", ou seja, a barra invertida dupla \\.

Quando, por exemplo, minha expressão de entrada é assim:

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

A contrabarra dupla é reduzida a uma única. Eu sei que posso adicionar mais barras invertidas na minha expressão, mas eu quero que essas expressões sejam genuínas do LaTeX, não uma estranha combinação LaTeX-bash.

Meu script:

#!/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

Então, como posso ignorar os caracteres de escape e literalmente imprimir minha expressão LaTeX? De preferência sem usar sed.

    
por Ailurus 02.10.2011 / 09:23

2 respostas

4

Se o TeX que você deseja gerar for corrigido em seu script, o mais seguro é usar algo assim:

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

Os dados entre os marcadores cat e END serão exibidos como estão sem substituições. (Eu estou supondo que todas as novas linhas adicionadas estão ok.)

Certifique-se de usar aspas duras ( ' ) ao passar seu TeX como argumento:

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

Todos os caracteres são interpretados literalmente entre aspas simples. Você usou aspas duplas e alguns caracteres ( $"\' ) são interpretados entre aspas duplas. Vejo Qual é o significado de uma única variável? e aspas duplas em variáveis de ambiente? No entanto, o exemplo da sua pergunta nunca usa caracteres problemáticos. Outros possíveis problemas que você evita estão usando echo (o echo integrado executa a expansão de barra invertida em alguns shells, mas não no bash, a menos que você o habilite explicitamente) e a falta de aspas duplas em torno de $1 ( echo $1 executaria expansão de barra invertida; echo "$1" não, em bash).

Uma maneira segura e portátil de imprimir uma string é literalmente

printf '%s\n' "$1"

Remova \n se você não quiser uma nova linha após a string.

Este é o seu código real? Se for, certifique-se de que o problema não está na maneira como você está passando os argumentos - você deve escrever algo como

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

Se você precisar de uma aspa simples dentro do snippet TeX, você terá que escapar dela: '\'' .

Você pode estar interessado na construção here document , que permite que você tenha convenientemente uma cadeia de várias linhas em sua origem Arquivo. Ou você pode incluir uma string multilinha entre aspas simples.

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

Note que você deve usar aspas duplas em torno de $2 também. Sempre use aspas duplas em torno de uma substituição de variável, a menos que você tenha uma boa razão para não fazê-lo.

    
por 03.10.2011 / 01:53